在将甲方粑粑的想法实践于世人之前,我们的项目至少要经历 开发→测试→运行 3个环境,对于不同的环境我们可能需要连接不同的数据库、设定不同的上传路径、调用不同地址的远程服务等等,这就要求必须有不同的配置来满足多环境需求
如果我们是通过打包前手动修改文件内容的话,会由于内容繁多,产生头晕眼花、手脚无力、反应迟钝等症状,从而导致修改出错,以至于部署失败、运行出错、甲方粑粑很生气、后果很严重等问题。笔者就经历过这样的老旧项目,总共6个应用需要打包,每个应用至少改3个配置文件,而且甲方粑粑本着从严(sa)肃(le)认(ba)真(ji)的角度出发,设立了3个测试服务器+1个正式服务器+2个正式服务器的备胎???
为了避免在新项目中含泪走我的老路 ,我们就需要多环境的配置,SpringBoot支持通过配置多份不同环境的配置文件,用打包命令去区分打包
在SpringBoot中多环境配置文件名需要满足application-{profile}.properties或application-{profile}.yml格式,其中的{profile}对应当前环境标识,比如:
1、application-dev.yml开发环境
2、application-test.yml测试环境
3、application-pro.yml生成环境
至于哪个配置文件会被加载,我们需要在application.yml中通过spring.profile.active来设置,它的值即上文中的{profile}
#properties文件配置
spring.profiles.active=dev
#yml文件配置
spring:
profiles:
active: dev
这时候我们就可以根据环境运行不同的配置文件了
方式一:1、修改application.yml后直接打包
2、在对应环境直接运行jar -jar xx.jar命令进行部署
方式二:直接打包,在对应环境直接运行java -jar xxx.jar --spring.profiles.active=**命令进行部署
如果我们存在这样一种情况:不同环境的包由不同的运维人员去维护,他们相互之间要对配置信息进行隔离(比如数据源信息),那么我们来看下通过上文配置获取的jar包里面是什么样子。随便用一个反编译工具打开由上文配置打包的jar包
由此可见,该打包方式无法使各自环境的包相互隔离配置信息,所以我们需要用Maven分环境打包的协助
首先我们在pom.xml添加如下信息
dev
dev
true
test
test
false
prod
prod
false
src/main/resources
**/*
*.*
src/main/resources
true
application.yml
application-${profileActive}.yml
logback-spring.xml
mybatis/mapper/**/*.xml
然后将application.yml中改为
spring:
profiles:
active: @profileActive@
这样就可以由Maven去控制jar包的版本和资源隔离的问题,为了测试,我们打一个包看下里面的结构,执行mvn: clean package -P test命令,反编译得到的jar包
可以看到,通过Maven的过滤,我们获取了单一环境配置文件的jar包