0%

Maven(五): resources、profiles标签的实践

这里对resources、profile标签的使用进行介绍

abstract.png

resources 标签

打包资源

Maven中会按照标准目录结构,将src/main/resources目录下的资源文件打包到jar或war中。但有时为了方便文件的组织管理,有些资源文件可能并不在上述标准目录下。典型地有MaBatis的sql映射文件。为此,可通过resources标签实现对资源文件的打包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
<build>
...
<resources>
<!-- 将ConfigFile目录下的 file1.properties 文件打包 -->
<resource>
<directory>src/main/java/com/aaron/SpringBoot1/ConfigFile</directory>
<includes>
<include>file1.properties</include>
</includes>
</resource>
...
</resources>
...
</build>
...

从下图可以看到,只有我们指定打包的 file1.properties 文件被打包进去了,而 file2.properties 文件则未被打包进去

figure 1.jpeg

外置配置文件

jar包虽然部署方便,但是由于配置文件内置,导致如果期望现场修改配置文件非常不便。故我们可以利用resource标签再次添加一个配置,实现将相关配置文件复制到jar包外面。示例如下所示

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
<build>

<resources>
<!-- 打包所有资源文件 -->
<resource>
<directory>src/main/resources</directory>
<includes>
<!-- ** 表示任意一级目录, *.* 表示任意一个文件 -->
<include>**/*.*</include>
</includes>
</resource>


<!-- 再次将配置文件单独复制到与jar包同级目录(tagret)下 -->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*.properties</include>
<include>*.yml</include>
</includes>
<!-- targetPath的当前路径为target/classes -->
<targetPath>../</targetPath>
</resource>

</resources>

<plugins>
...
</plugins>

</build>

filtering 标签

ConfigFile目录下两个属性文件内容如下

figure 2.jpeg

通过下面的POM文件内容可知,我们通过properties标签来定义上述两个资源文件所引用的变量code.author。与此同时通过resource标签将上述两个资源文件均打包进去。值得注意的是,这两个资源的filtering标签分别为false、true。该标签的作用在于,是否将配置文件中的引用变量替换为真实的值。具体地,当这里的filtering为true时,资源文件中的 @code.author@ 就会被替换为 Aaron

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
...
<properties>
<code.author>Aaron</code.author>
</properties>
...
<build>
...
<resources>
<!-- 将ConfigFile目录下的file1.properties文件打包 -->
<resource>
<directory>src/main/java/com/aaron/SpringBoot1/ConfigFile</directory>
<!-- 默认值即为false,故可省略 -->
<filtering>false</filtering>
<includes>
<include>file1.properties</include>
</includes>
</resource>

<!-- 将ConfigFile目录下的file2.properties文件打包 -->
<resource>
<directory>src/main/java/com/aaron/SpringBoot1/ConfigFile</directory>
<filtering>true</filtering>
<includes>
<include>file2.properties</include>
</includes>
</resource>
...
</resources>
...
</build>

测试结果如下,符合预期

figure 3.jpeg

profiles 标签

实际开发中,多环境的配置非常常见。为了便于管理各种不同环境下的配置,这里可以借助Maven的profiles标签实现

根据不同的环境打包相应的资源文件

假设在 src/main/java/com/aaron/SpringBoot1/ProfileFile 下,存在分别名为 profile-dev.properties、profile-test.properties的两个属性文件。显然,它们分别是开发dev、测试test环境。为了实现根据不同的环境打包相应的资源文件,可以通过 properties、resource 标签实现

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
<profiles>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<activation>
<!--指定该环境为默认配置-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<current.env>dev</current.env>
</properties>
</profile>

<!-- 测试环境 -->
<profile>
<id>test</id>
<properties>
<current.env>test</current.env>
</properties>
</profile>

</profiles>

<build>
<resources>

<resource>
<directory>src/main/java/com/aaron/SpringBoot1/ProfileFile</directory>
<includes>
<include>profile-${current.env}.properties</include>
</includes>
</resource>
...
</resources>
</build>

这样,选择不同的profile,即会相应改变current.env属性的值。这样,在resource标签处通过引用该属性即可实现在不同的环境下只打包相应的文件。这里,我们以使用测试test环境为例。可以看到其只会将 profile-test.properties 文件打包进去,而不会打包profile-dev.properties文件

figure 4.png

properties 标签

当然也可以直接在profile标签下使用properties标签来定义不同环境下属性变量的值,然后直接在相应的资源文件直接引用相关的属性变量来实现多环境配置。例如下面的mysql.properties文件中,引用了两个属性值——mysql.username、datasource.url

1
2
username=@mysql.username@
mysql=@datasource.url@

然后,我们在各环境的profile下定义上述两个属性的值。值得注意的是,对于resource标签的mysql.properties文件而言,一定要将 filtering 标签设为true。否则无法将引用变量替换为值

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
<profiles>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<activation>
<!--指定该环境为默认配置-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<mysql.username>root</mysql.username>
<datasource.url>jdbc:mysql://127.0.0.1</datasource.url>
</properties>
</profile>

<!-- 测试环境 -->
<profile>
<id>test</id>
<properties>
<mysql.username>admin</mysql.username>
<datasource.url>jdbc:mysql://12.34.56.78</datasource.url>
</properties>
</profile>
</profiles>

<build>
<resources>
<resource>
<directory>src/main/java/com/aaron/SpringBoot1/ProfileFile</directory>
<filtering>true</filtering>
<includes>
<include>mysql.properties</include>
</includes>
</resource>
...
</resources>
</build>

这里,我们以使用测试test环境为例。可以看到mysql.properties文件中的引用变量已经被替换为test环境中定义的属性值

figure 5.jpeg

filters

虽然我们可以在profile标签下使用properties标签来定义不同环境下的属性值。但是一旦属性数量较大,就会显得POM文件非常冗长了。为此,我们可以将原本properties标签定义的属性变量放置在一个资源文件下,并通过filters标签来进行指定。故首先,我们将dev、test环境下的属性值定义在两个不同的文件mysql-profile-dev.properties、mysql-profile-test.properties中,内容如下所示

figure 6.jpeg

然后,通过filters标签指定各profile下的自定义属性的文件。当然,resource 标签下的filtering标签,也必须为true

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

<profiles>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<activation>
<!--指定该环境为默认配置-->
<activeByDefault>true</activeByDefault>
</activation>
<build>
<filters>
<filter>src/main/java/com/aaron/SpringBoot1/ProfileFile/mysql-profile-dev.properties</filter>
</filters>
</build>
</profile>

<!-- 测试环境 -->
<profile>
<id>test</id>
<build>
<filters>
<filter>src/main/java/com/aaron/SpringBoot1/ProfileFile/mysql-profile-test.properties</filter>
</filters>
</build>
</profile>

</profiles>

<build>
<resources>
<resource>
<directory>src/main/java/com/aaron/SpringBoot1/ProfileFile</directory>
<filtering>true</filtering>
<includes>
<include>mysql.properties</include>
</includes>
</resource>
...
</resources>
</build>

这里,我们以使用dev环境为例。可以看到mysql.properties文件中的引用变量已经被替换为 mysql-profile-dev.properties文件中定义的属性值。值得一提的是,filter标签下的文件mysql-profile-dev.properties、mysql-profile-test.properties并不会被打包

figure 7.jpeg

请我喝杯咖啡捏~

欢迎关注我的微信公众号:青灯抽丝