转载:https://blog.csdn.net/goldenfish1919/article/details/100525998
一般项目的结构都是类似下面这种,有多个profile:
其中,我们需要在application.yml中设置一个active的profile,如下:
spring:
profiles:
active: dev
这种方式,只需要在运行项目的时候设置–spring.profiles.active参数,如下:
java -jar aa.jar --spring.profiles.active=dev
就可以切换不同的profile。
有时候,我们可能需要在pom.xml中也需要配置多个profile,比如:
<profiles>
<profile>
<id>dev</id>
<properties>
<package.environment>dev</package.environment>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
。。。
</profiles>
这个时候打包的命令是类似于:
mvn clean package -Pdev
这样打包以后,在运行的时候,还是需要显式的指定spring.prefiles.active才可以切换不同的profile,因为application.yml中已经把这个参数的值写死了。如何把pom中的-P参数跟application.yml中的spring.profiles.active给联系起来呢?显然只要让application.yml的spring.profiles.active能接收一个参数而不是写死一个固定值,通过-P给这个参数赋值就可以了,改造如下:
(1)application.yml
spring:
application:
name: ${project.groupId}:${project.artifactId}
profiles:
#以下两种方式等价
active: ${package.environment}
#active: @package.environment@
# 把active的profile设置为一个变量package.environment,它值从pom传递过来
# 这里主要是利用maven-resources-plugin来做变量替换
(2)pom.xml
<profiles>
<profile>
<id>dev</id>
<properties>
<!--这里定义package.environment这个变量-->
<package.environment>dev</package.environment>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<package.environment>test</package.environment>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<profile>
<id>pro</id>
<properties>
<package.environment>pro</package.environment>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>
<!--通过这个plugin填充配置文件中的占位符-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<!--springBoot支持默认的$符填充配置文件的value-->
<useDefaultDelimiters>true</useDefaultDelimiters>
</configuration>
</plugin>
这样,打包的时候只需要在,命令行指定-P参数,如下:
mvn clean package -Pdev -DskipTests
运行的时候,就不在需要设置profile了:
java -jar profile-demo-0.0.1-SNAPSHOT.jar
因为,maven-resources-plugin已经把配置文件application.yml里面的占位符替换成了-P指定的值,此时application.yml的内容是这样的:
spring:
application:
name: com.github.xjs:profile-demo
profiles:
active: dev
#active: dev
这么做还一个好处是无论有多少个Profile,可以只写一个Dockerfile,只需要在jenkins打包的时候设置-P参数就可以了。