dev、test、uat、sit、prod多环境,IDEA动态打包的几种方式
背景
实际软件开发工作中,软件会经历dev、test、uat、sit、prod多个环境的部署、测试运行,我们往往需要根据不同的环境配置设置打包属性。SpringBoot项目虽然可以通过spring.profile.active即可动态切换比较简单,但是对于pom.xml动态配置打jar/war包不好配置,本文将介绍几种方式供大家参考。同时由于网上只有在idea中如何进行配置使用,但是没有idea配置运行profile失效的问题解决的教程,于是我便根据我实际遇到的问题将解决方案分享给大家。
Spring Boot
项目结构如图:
配置属性
在application.properties
中配置要激活的具体环境配置文件
# 这里test对应application-test.properties文件,可以切换成自己想使用的配置文件
spring.profiles.active=test
运行应用
可以看到这里提示我们激活的是application-test.properties
Maven
通过这种方式可以动态配置SpringBoot项目在不同环境的配置,但是当我们想要在不同环境通过上面的方式动态选择打jar/war
包时就不太方便了,因此接下来介绍通过maven动态配置profile实现动态切换打包的配置信息
配置pom.xml
1、project>>build>>plugins下添加maven-resources-plugin
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
</plugin>
</plugins>
</build>
2、project>>build下添加resources
配置静态资源,这一步主要筛选需要进行属性渲染的配置文件
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<!-- 设置resourecs下的properties进行属性渲染再copy到target目录 -->
<filtering>true</filtering>
<includes>
<include>application-${profile.active}.yml</include>
<include>application.yml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<!-- 将resources目录下其他静态资源copy到target目录但是不进行属性渲染 -->
<filtering>false</filtering>
<excludes>
<exclude>application-${profile.active}.yml</exclude>
<exclude>application.yml</exclude>
</excludes>
</resource>
</resources>
</build>
3、project下添加profiles
<profiles>
<profile>
<id>dev</id>
<properties>
<!-- 自己定义的属性名,用于后续配置打包方式 -->
<profile.packaging>jar</profile.packaging>
<!-- 自己定义的属性名,用于配置springboot激活的配置文件 -->
<profile.active>dev</profile.active>
</properties>
<!-- 默认激活当前配置 -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profile.packaging>jar</profile.packaging>
<profile.active>test</profile.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profile.packaging>war</profile.packaging>
<profile.active>prod</profile.active>
</properties>
</profile>
<!-- uat、sit省略 -->
</profiles>
4、project下配置打包方式
<!-- 这里是profile中自定义的属性 -->
<packaging>${profile.packaging}</packaging>
配置applicaiont.properties
# 默认@xxx@或者${xxx},可以修改maven-resources-plugin分割符
spring.profiles.active=@profile.active@
通过这种方式就配置好了多环境的打包方式与激活的配置文件
使用方式
命令行
通过命令行打包配置激活profile,下面给出使用prod配置文件的例子
mvn package -P prod
IDEA
通过idea界面可以指定使用的profile
然后在界面进行打包
遇到的问题
切换profile后idea配置无法正常使用
通过前面提到的方式打包之后再次运行idea的运行配置之后会发现静态资源没有得到渲染
这里我查了一下大概原因是因为idea的配置在运行时会执行build步骤,该步骤会检查编译生成的target目录下的文件,主要依据是classes文件夹内容是否有变化,如果没有就不进行重新编译。在这个过程中可能会导致maven-resource-plugin功能失效导致静态资源没有copy成功。
一种解决方式是修改ieda配置,打开编辑配置界面,选中add before launch task
,在程序运行之前定制化我们的构建流程。
点击+
号选择要添加的任务类型
配置如下:
运行成功,这样就不用担心切换profile之后静态资源不生效了