什么是profile
开发项目的时候要有多个环境,如开发环境、测试环境、生产环境,他们的配置文件一般不同。当我们要向各个环境发布程序时,需要人工处理这些配置文件,这显然麻烦且易错。有了profile,一切问题就简单了。只要在maven打包时使用下面命令即可。
mvn clean package -Dmaven.test.skip=true -P prod
-P prod
就是告诉maven要使用名字为prod的profile来打包,这样打包后的jar包或war包,配置文件里的配置就是prod环境的。
实现思路
maven支持profile功能,当使用maven profile打包时,可以打包指定目录和指定文件,且可以修改文件中的变量。spring boot也支持profile功能,只要在application.properties文件中指定spring.profiles.active=xxx 即可,其中xxx是一个变量,当maven打包时,修改这个变量即可。
具体实现
一个springboot项目,工程中src/main/resourses
目录下有以下4个配置文件:
- application.properties: 包含通用配置的文件。文件中有[email protected]@的属性。这里的profiles.active和下面pom.xml配置中的profiles.active属性名要一致。这样,在运行mvn命令时,maven就会帮我们将@profiles.active@替换成指定的profile。
- application-dev.properties: 当-P dev时, 打包这个文件。
- application-test.properties: 当 -P test时,打包这个文件。
- application-prod.properties: 当 -P prod时,打包这个文件。
在(父)pom.xml中定义maven的如下各个环境的profile配置,这里的profiles.active
属性名可以自定义,其中test环境是默认激活的(activeByDefault为true),这样如果在不指定profile时默认是test环境。
<profiles>
<profile>
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>pre</id>
<properties>
<profiles.active>pre</profiles.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
</profile>
</profiles>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>application-dev.properties</exclude>
<exclude>application-test.properties</exclude>
<exclude>application-pre.properties</exclude>
<exclude>application-prod.properties</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application-${profiles.active}.properties</include>
<include>application.properties</include>
</includes>
</resource>
</resources>
</build>
说明:
- 这里的excludes 表示打包时,过滤多余其它目录或文件,比如过滤目录:
<excludes>
<exclude>dev/*</exclude>
<exclude>test/*</exclude>
<exclude>pre/*</exclude>
<exclude>prod/*</exclude>
</excludes>
- includes表示打包,指定要包含的文件,其中${profiles.active}会根据指定的profile动态替换,当然一般不需要过滤或指定,如下配置就可以了:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
-
filtering 设置true表示处理文件时,可以对文件进行动态替换
-
在application.properties属性文件中替换变量时,使用@符号,而不是$, maven的maven-resources-plugin可以定义这个替换的符号。
[email protected]@
- 怎么在启动spring boot应用时,打印正在使用的profile,避免配置错误
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(RestApiApplication.class, args);
String[] activeProfiles = ctx.getEnvironment().getActiveProfiles();
for (String profile : activeProfiles) {
logger.warn("Spring Boot 使用profile为:{}" , profile);
}
}
参考: