Maven 激活 SpringBoot 配置文件

前言

为了实现不同环境构建的不同需求,这里使用到了 Maven 的 Profile 特性。因为 Profile 能够在构建时修改 POM 的一个子集,或者添加额外的配置元素。接下来将介绍 Maven 中对 Profile 的配置和激活。

Maven 配置

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
<build>
<finalName>${project.name}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>

<project>
<!--多环境配置-->
<profiles>
<profile>
<id>dev</id>
<properties>
<!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>dev</profiles.active>
<nacos.username>nacos</nacos.username>
<nacos.password>nacos</nacos.password>
</properties>
<activation>
<!-- 是否为默认环境 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>prod</profiles.active>
<nacos.username>admin</nacos.username>
<nacos.password>admin</nacos.password>
</properties>
<activation>
<!-- 是否为默认环境 -->
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>
</project>

SpringBoot 配置

在 SpringBoot 项目的 application.yml 配置文件中,可以通过 @属性名@ 的格式获取在 <profile> 标签中定义的属性值,同时还可以通过 @profiles.active@ 的格式来获取当前被激活的 Profile 的 Id 属性。

配置案例一

1
2
3
spring:
profiles:
active: @profiles.active@

配置案例二

在下述的例子中,使用 Nacos 作为配置中心,当 Maven 激活不同的 Profile 时,Nacos 的客户端会从配置中心拉取 Profile 对应的配置信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server:
port: 9091

spring:
application:
name: @artifactId@
cloud:
nacos:
username: @nacos.username@
password: @nacos.password@
discovery:
server-addr: ${NACOS_HOST:shop-register}:${NACOS_PORT:8848}
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
extension-configs[0]:
data-id: shop-application-@profiles.active@.yml
refresh: true
extension-configs[1]:
data-id: @artifactId@-@profiles.active@.yml
refresh: true

无法解析 @ 符号

若使用了上述的 SpringBoot 配置内容后,在 IDEA 内启动项目时,提示 @...@ 的内容无法解析,可以按照以下步骤解决。

  • 第一步:在 POM 里添加 Maven 插件
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
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<filtering>false</filtering>
<includes>
<include>**/*.*</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<delimiters>@</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
</build>
  • 第二步:先执行 Maven 的编译命令,再让 IDEA 启动项目
1
$ mvn clean install

Maven 激活配置

  • 当打包项目时,可以在 Maven 的命令行中添加参数 -P,指定要激活的 Profile 的 Id,这样就可以激活不同的环境配置。
1
$ mvn clean package -Pdev
  • 如果一次要激活多个 Profile,可以用逗号分开一起激活
1
$ mvn clean package -Pdev,test
  • 若希望查看当前默认激活的是哪个 Profile,可以使用以下命令
1
$ mvn help:active-profiles

Maven 读取系统环境变量

在 Linux 系统环境中,Maven 可以使用 ${env.xxxx} 的格式读取到系统的环境变量,使用示例如下:

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
<project>
<!--多环境配置-->
<profiles>
<profile>
<id>dev</id>
<properties>
<!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>dev</profiles.active>
<nacos.username>nacos</nacos.username>
<nacos.password>nacos</nacos.password>
</properties>
<activation>
<!-- 是否为默认环境 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>prod</profiles.active>
<nacos.username>${env.NACOS_USERNAME}</nacos.username>
<nacos.password>${env.NACOS_PASSWORD}</nacos.password>
</properties>
<activation>
<!-- 是否为默认环境 -->
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>
</project>

参考资料