当Spring boot profiles 遇到maven profile

1,262 阅读1分钟

相信大家都用过spring Boot profile 和 maven profile,在使用Spring boot profile时我们都会有如下的配置。

其中*.properties文件中存放的时不同环境下的配置信息. application.yml中会有下面一段配置信息

spring:
  profiles:
    active: "dev"

当我们想想换一个profile时会需要去更改spring.profiles.active 的值,这样是不是还比较麻烦.

再让我们看看我们使用maven profile的配置, 在使用maven配置是使用的是如下的spring boot配置文件.

pom.xml的配置如下:

<!--配置环境的profile-->
<profiles>
   <profile>
	<id>dev</id>
	<properties>
	    <profiles.activation>dev</profiles.activation>
	</properties>
   </profile>
   <profile>
	 <id>local</id>
	 <properties>
		<profiles.activation>local</profiles.activation>
	 </properties>
   </profile>
</profiles>

那我们使用maven 相关的命令时, 它是如何找到正确的配置呢, 这时就需要用到 build -> resources相关的配置了.如下所示:

<resource>
	<directory>src/main/config/${profiles.activation}</directory>
	<filtering>true</filtering>
</resource>

这个配置表明只保留src/main/config/下与profiles.activation相匹配的文件夹. 也就是说当你运行如下maven命令时

mvn package -P local

此时对应的profiles.activation属性就是local, 则config/下的local目录就是被保留,则使用的spring 配置就是在local下的application.properties文件.

既然Spring boot 和 maven都有profile相关的配置,那二者能不能结合使用, 这样再使用maven打包时, 通过指定profile, 让spring boot的profile自动切换成maven指定的profile,这样就不用我们认为的每次手动更改了,幸运的是Spring Boot也想到了这一点, 下面我们看看如何让二者配合工作. 首先Spring boot的配置文件不变,唯一要更改的是将application.yml文件改成如下所示, spring boot支持使用@...@来映射maven中定义的属性.

spring:
  profiles:
    active: @profiles.activation@

再来看看maven相关配置的变化, maven中关于profile的配置是不变的, 但是由于我们更改的spring boot配置,引入了profile,所以resources的配置会做如下调整:

<resource>
	<directory>src/main/resources/config</directory>
	<filtering>true</filtering>
	<includes>
		<include>application-${profiles.activation}.properties</include>
		<include>application.yml</include>
	</includes>
</resource>

这样配置完之后,你在使用maven打包后,spring boot就会选择你使用的maven profile作为spring boot的profile, 你也不需要手动更改spring boot的profile啦,是不是很清爽。