java如何按照标签替换_Maven(五):resources、profiles标签的实践

ae9b4fd0641f2b3bfd9afad9b25a030a.png

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

resources 标签

打包资源

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

...
<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 文件则未被打包进去

abbb0b93b47b3b9a29b151b20cdbd54c.png

filtering 标签

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

9ba834eb8814d5815f252000284de094.png

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

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

测试结果如下,符合预期

e5064dd5cea6029a4cb1987db7f65c7e.png

profiles 标签

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

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

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

<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文件

ea36620d87318b0392e8da5ce312960f.png

properties 标签

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

username=@mysql.username@
mysql=@datasource.url@

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

<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环境中定义的属性值

29dad08f2d51a8e12003b6b3b6a77c93.png

filters

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

7d3983110b57089a26c79302bfbaf735.png

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

<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并不会被打包

b8b3b907165e43d6376677cf9b2510b1.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值