我们在开发中,总是少不了对项目环境的配置。而且对于不同的环境我们的配置可能是不同的,例如:数据源的配置、日志的级别等。开发,测试,生产每个环境可能配置都不一致,要是没有多环境的自由切换,部署起来是很繁琐也容易出错的。下面介绍spring boot
提供的Profile
实现多场景下的配置切换,方便开发中进行测试和部署生产环境。
演示环境
- JDK 1.8
- Spring Boot 2.0.6.RELEASE
- Maven 3.5.4
- IntelliJ IDEA 2018.2.1 (Community Edition)
- Firefox
实现多环境配置
首先:在Spring Boot项目中定义不同环境的配置文件
这里使用application.yml
文件,内容如下:
# common properties
spring:
profiles:
active: @profiles.active@
配置开发环境相关的配置文件application-dev.yml
# dev properties
spring:
profiles: dev
server:
port: 8080
constant:
environment: dev
配置测试环境相关的配置文件application-test.yml
# test properties
spring:
profiles: test
server:
port: 8081
constant:
environment: test
配置生产环境相关的配置文件application-prod.yml
# prod properties
spring:
profiles: prod
server:
port: 8082
constant:
environment: prod
接下来:在项目的pom.xml
文件中定义profile
配置相关的pom.xml
的内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-boot-demos</artifactId>
<groupId>xin.jerome</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-boot-demo-configuration-environment</artifactId>
<profiles>
<!--development environment-->
<profile>
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--test environment-->
<profile>
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
</profile>
<!--production environment-->
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<finalName>test-configuration-environment</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
编写验证环境的Controller
我们在项目中定义一个HelloController
,来获取我们配置文件中配置的constant.environment
的值,来验证我们是否已经切换到了我们所需的那个环境。代码如下:
package xin.jerome.configuration.contorller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 获取环境配置{@link RestController}
*
* @author Jerome Zhu
* @since 2018.11.19 11:22
*/
@RestController
public class HelloController {
@Value("${constant.environment}")
private String environment;
@GetMapping("/env")
public String getEnvironment() {
return "Hello Jerome, This environment is " + environment;
}
}
当我们使用浏览器访问项目/env
路径时,就会返回我们当前环境的constant.environment
的值。
灵活切换环境
启动默认环境配置
因为我们在项目的pom.xml
中,使用<activeByDefault>true</activeByDefault>
这段配置,定义了dev
为项目的默认环境。所以当开发的中启动项目会默认使用application-dev.yml
的配置。在控制台的日志的第二行会有这么一段日志The following profiles are active: dev
,表示已经加载了开发环境相关的配置。并且我们配置的端口号是8080
。通过浏览器访问localhost:8080/env
,会得到下图的结果:
使用jar包的方式启动测试环境
我们首先使用Maven
命令mvn clean package
对项目进行打包,然后我们先使用java -jar xxx.jar
命令启动项目。我们会发现日志输出了The following profiles are active: dev
,说明我们启动了我们的开发环境,通过浏览器访问localhost:8080/env
,得到的结果和上面的一样。接下来我们使用java -jar xxx.jar --spring.profiles.active=test
命令启动项目,切换环境到我们的测试环境。因为我们的测试环境使用的是8081
端口,所以我们通过浏览器访问localhost:8081/env
,会得到如下结果:
通过Maven
对生产环境进行打包
我们使用Maven
命令mvn clean package -Pprod
对项目的进行打包,然后我们直接使用java -jar xxx.jar
命令启动项目。我们会发现日志输出了The following profiles are active: prod
,说明我们启动了我们的生产环境,我们的生产环境使用的是8082
端口,通过浏览器访问localhost:8082/env
,会得到如下结果:
因为我们在打包的时候已经选择了生产环境的配置,所以直接运行就可以使用生产环境相关配置。
如果我们没有配置多环境,那么在我们启动
Spring Boot
项目的时候,在日志的第二行会输出No active profile set, falling back to default profiles: default
。
总结
我们通过简单的配置和上面三种方法对配置环境的切换,实现了灵活的切换配置,不用在频繁的手动的切换相关环境的配置。这样我们避免了很多配置错误而引发的bug。
具体的代码可以参考GitHub:spring-boot-demo-configuration-environment小节。
原文链接:Spring Boot 多环境配置