Maven profiles

1.wiki

Profiles 是 Spring 框架的核心特性,用来区分环境,允许将不同文件或代码仅映射到相应环境,并仅加载相应环境文件和代码

1. 文件级别

使用 pom.xml 的 profile 属性,来去别环境,并使用 spring 的双@占位符在打包时替换

1. pom 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<profiles>
<profile>
<id>dev</id>
<properties>
<profileActive>dev</profileActive>
</properties>
<activation>
<!-- 默认值,默认是 false -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profileActive>test</profileActive>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profileActive>prod</profileActive>
</properties>
</profile>
</profiles>

<!-- 资源过滤,主要针对 application-*.properties -->
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- 排除所有 application -->
<excludes>
<exclude>application*.properties</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<!-- 动态替换 application 中的 @XX@ 属性 -->
<filtering>true</filtering>
<!-- 包括 -->
<includes>
<include>application.properties</include>
<include>application-${profileActive}.properties</include>
</includes>
</resource>
</resources>

2. application.properties

除了各个环境的自定义配置,可以声明一个公共 application.properties,使用 @xx@ 在编译后替换为 profile 中属性

1
2
# 编译后变为上述 profile 中配置项 
spring.profiles.active: @profileActive@

3. 打包

使用 -P 指定环境,如 mvn clean install -Pdev 打包 dev 环境

2. 代码级别

@Profile 注解,用在类和方法上,指定 bean 仅在特定的 profile 环境中生效

1
2
3
4
5
6
7
8
9
10
11
@Component
@Profile("prod")
public class DevBean {
// bean 仅在 prod 环境生效
}

@Component
@Profile("!prod")
public class DevBean {
// bean 仅在 prod 环境不生效
}

激活方式

  • jar : java -jar -Dspring.profiles.active=prod *.jar
  • 代码设置环境变量 : System.setProperty("spring.profiles.active", "prod");
  • Spring 容器中激活 :
    1
    2
    3
    4
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    ctx.getEnvironment().setActiveProfiles("prod");
    ctx.register(XxxConfig.class);
    ctx.refresh();