-
血泪背景
在将甲方粑粑的想法实践于世人之前,我们的项目至少要经历 开发→测试→运行 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添加如下信息
<profiles>
<profile>
<id>dev</id>
<properties>
<profileActive>dev</profileActive>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profileActive>test</profileActive>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<profileActive>prod</profileActive>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>
<build>
<resources>
<!-- 先在资源根目录排除所有的资源文件 -->
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*</exclude>
<exclude>*.*</exclude>
</excludes>
</resource>
<!-- 再单独指定需要拷贝的资源文件 -->
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application.yml</include>
<include>application-${profileActive}.yml</include>
<include>logback-spring.xml</include>
</includes>
</resource>
<!-- 此配置不可缺,否则mybatis的Mapper.xml将会丢失 -->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
然后将application.yml中改为
spring:
profiles:
active: @profileActive@
这样就可以由Maven去控制jar包的版本和资源隔离的问题,为了测试,我们打一个包看下里面的结构,执行mvn: clean package -P test命令,反编译得到的jar包
可以看到,通过Maven的过滤,我们获取了单一配置文件的jar包