使用SpringBoot2.0搭建企业级应用开发框架(五)多环境配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mxxrgxg/article/details/81478760
  • 血泪背景

在将甲方粑粑的想法实践于世人之前,我们的项目至少要经历 开发→测试→运行 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包

猜你喜欢

转载自blog.csdn.net/mxxrgxg/article/details/81478760