问题描述
我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。
多环境是最常见的配置隔离
方式之一,可以根据不同的运行环境提供不同的配置信息来应对不同的业务场景,在Spring Boot
内支持了多种配置隔离的方式,可以激活单个或者多个配置文件。
官方文档
https://docs.spring.io/spring-boot/docs/2.3.3.RELEASE/reference/htmlsingle/#boot-features-profiles
解决方案
Spring Boot多环境配置
在Spring Boot中多环境配置文件名需要满足application-{profile}.properties
的格式,其中{profile}
对应你的环境标识,比如:
application-dev.properties:开发环境
application-test.properties:测试环境
application-prod.properties:生产环境
激活Profiles方式
方法一:配置文件
在application.properties或者
application.yml文件中通过spring.profiles.active
属性来设置,其值对应{profile}
值。
如:
spring.profiles.active=test
就会加载application-test.properties
配置文件内容
application.properties中配置通用内容,并设置spring.profiles.active=dev,以开发环境为默认配置
application-{profile}.properties中配置各个环境不同的内容
方法二:命令行
命令行方式
是一种外部配置的方式,在执行java -jar
命令时可以通过--spring.profiles.active=test
的方式进行激活指定的profiles
列表。
java -jar xxx.jar --spring.profiles.active=dev
针对各环境新建不同的配置文件application-dev.properties
、application-test.properties
、application-prod.properties
在这三个文件均都设置不同的server.port
属性,如:dev环境设置为8080,test环境设置为9090,prod环境设置为80
application.properties中设置spring.profiles.active=dev
,就是说默认以dev环境设置
测试不同配置的加载:
执行java -jar xxx.jar,可以观察到服务端口被设置为8080,也就是默认的开发环境(dev)
执行java -jar xxx.jar --spring.profiles.active=test,可以观察到服务端口被设置为9090,也就是测试环境的配置(test)
执行java -jar xxx.jar --spring.profiles.active=prod,可以观察到服务端口被设置为80,也就是生产环境的配置(prod)
方法三:Java系统属性
Java系统属性方式
也是一种外部配置的方式,在执行java -jar
命令时可以通过-Dspring.profiles.active=test
的方式进行激活指定的profiles
列表。
使用方式如下所示:
java -Dspring.profiles.active=dev -jar xxx.jar
注意:
-D
方式设置Java系统属性
要在-jar
前定义。
方法四:环境变量
在程序代码的application.properties里的spring.profiles.active=uat不变
在本地的开发环境/IDE所在的电脑上设置spring.profiles.active=dev, 在开发服务器上也设置成dev
在uat本地服务器上,设置spring.profiles.active=uat或者不设置它
在prod生产服务器上,设置spring.profiles.active=prod
相同的jar或者war包,在不同的服务器上运行不同的环境, 不用再手动修改application.properties文件
Linux/MAC环境下
su root vim ~/.bash_profile source ~/.bash_profile
在~/.bash_profile里最后一行增加
export SPRING_PROFILES_ACTIVE=dev
Windows环境下
环境变量的配置方式请参考Java环境变量配置,新建一个名为
SPRING_PROFILES_ACTIVE
的系统环境变量,设置变量的值为dev
即可。
系统变量的方式适用于系统下所部署统一环境的
SpringBoot
应用程序,如统一部署的都是prod
环境的应用程序。
优先级
命令行 > Java系统属性 > 系统变量 > application.yml或application.properties配置文件>application-default.properties
参考文章
Spring Boot项目在多环境(开发、生产或测试环境)调用不同配置文件方式
Spring Boot spring.profiles.active 环境变量配置