#编译mvn clean package -Dmaven.test.skip=true
Spring Boot 允许准备多个配置文件,可以在系统部署的时候,指定使用哪个配置文件覆盖默认的application.properties,从而完成多环境部署。
需要在resource下创建application-{profile}.properties 的配置文件,其中profile可以是任意名字,比如:
profile | 说明 |
test | 表示测试环境 |
prod | 表示线上环境 |
pre-prod | 表示预发布环境 |
demo1.0 | 1.0版本演示环境 |
这些配置文件可以添加或覆盖application.properties文件的属性。
在环境变量中,spring.profile.active指定使用哪个profile,比如:
java -jar -Dspring.profiles.active=prod target/demo-0.0.1.jar
java -jar -Dspring.profiles.active=prod target/demo-0.0.1.jar --server.port=8080
java -jar target/demo-0.0.1.jar --spring.profiles.active=prod --server.port=8080
#后台运行nohup java -jar target/demo-0.0.1.jar --spring.profiles.active=prod > /dev/null 2>&1 &
以上配置成功后,Spring Boot 将读取resource/application-prod.properties配置文件,覆盖默认的application.properties选项。
application.properties的内容如下:
server.port=8080...
application-prod.properties的内容如下:
server.port=9000...
如果使用war方式部署,添加系统属性是比较好的方式,下面以Tomcat为例进行说明。
编辑catalina.sh,在sh文件的开头部分添加如下内容:
JAVA_OPTS="-Dspring.profiles.active=prod"
在多环境部署中,通常resource目录下可能没有目标环境的配置文件,这主要是为了安全考虑,开发环境不应该有线上环境的各种配置信息。可以将配置文件放到特定的目录中,并用spring.config.location指定配置文件的目录:
java -jar -Dspring.config.location=file:env/ -Dspring.profiles.active=test target/demo-0.0.1.jar
配置文件位于当前目录的env目录下,profile是test,因此读取的是application-test.properties配置文件。
注意:无论用上面那种多环境配置方法,总是会覆盖已有的application.properties。
Spring Boot 如何找到配置文件:
Spring Boot应用默认读取了application.properties文件,实际上,Spring Boot会自动搜索以下目录下的文件,优先级由低到高,file:config/的优先级最高。
文件目录 |
classpath: |
classpath:/config |
file: |
file:config/ |
这是系统属性spring.config.location默认的配置。spring.config.name表示配置文件的名称,默认是application。
@Profile注解
系统属性spring.profiles.active可以指定使用哪种配置文件,如果指定test,则application-test.properties会覆盖默认的application.properties。
@Profile注解可以结合@Configuration和@Component使用,以决定配置类会否生效。
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Profile;import org.springframework.core.env.Environment;import javax.sql.DataSource;@Configurationpublic class DataSourceConf { @Bean(name="dataSource") @Profile("test") public DataSource testDataSource(Environment env) { HikariDataSource test = getDataSource(env); test.setMaximumPoolSize(10); return test; } @Bean(name="dataSource") @Profile("prod") public DataSource testDataSource(Environment env) { HikariDataSource test = getDataSource(env); test.setMaximumPoolSize(200); return test; } private HikariDataSource getDataSource(Environment env) { HikariDataSource ds = new HikariDataSource(); // 省略初始化代码 return ds; } }
@Profile注解可以支持使用多种profile,也可以使用“!”来排除特定profile。
@Profile({"test", "prod"}) 测试环境和线上环境生效
@Profile({"test", "!prod"}) 测试环境和非线上环境生效