maven resources与配置分离

发布于:2023-01-22 ⋅ 阅读:(205) ⋅ 点赞:(0)

1. resources简介

maven的resources默认使用的插件是maven-resources-plugin,主要是用于执行资源文件拷贝。

我们先看一个示例,然后在一一介绍。

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>config/**</exclude>
            </excludes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/resources/config/${pkg.env}</directory>
            <includes>
                <include>config.mybatis.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

resources目录示例

2. directory

directory目录是指定资源文件位置,默认是src/main/resources目录,一般我们不配置这个,默认就是把src/main/resources目录下的所有文件都拷贝。

3. exclude

exclude的是排除文件、目录。

<resource>
    <directory>src/main/resources</directory>
    <excludes>
        <exclude>config/**</exclude>
    </excludes>
    <filtering>true</filtering>
</resource>

例如我们把不同环境的配置文件都放在config目录下,打包的时候按需拷贝。

因为默认会拷贝src/main/resources下的所有目录和文件,所有只需要配置exclude:config/**,表示排除config目录及其子目录及文件。

5. filtering

filtering是用参数替换占位符的过程,必须和filters一起使用。

<build>
    <filters>
        <filter>src/main/resources/config/dev/application-dev.properties</filter>
    </filters>
</build>

什么意思呢?例如:

application.properties文件中有一个配置项

jdbc.url=${dev.jdbc.url}

filter文件application-dev.properties也有相同配置项:

dev.jdbc.url=jdbc:mysql://127.0.0.1:3306/test

拷贝文件application.properties时,如果filtering为true

application.properties文件中的${dev.jdbc.url}占位符就会被替换,变为:

jdbc.url=jdbc:mysql://127.0.0.1:3306/test

注意:

如果使用SpringBoot,应该把${dev.jdbc.url}替换为@dev.jdbc.url@

通常,filtering会和profile配合一起使用,不同环境激活不同的配置文件,从而实现配置分离。

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <filters>
                <filter>src/main/resources/config/dev/application-dev.properties</filter>
            </filters>
        </build>
    </profile>
    <profile>
        <id>pro</id>
        <build>
            <filters>
                <filter>src/main/resources/config/pro/application-pro.properties</filter>
            </filters>
        </build>
    </profile>
</profiles>

6. include

如果像mybatis的配置文件,里面有大量properties,我们也通过filtering来替换吗?

显然,这样不太合适。这个时候,我们可以直接拷贝文件。

<resource>
    <directory>src/main/resources/config/${pkg.env}</directory>
    <includes>
        <include>config.mybatis.xml</include>
    </includes>
    <filtering>false</filtering>
</resource>

directory配置到指定目录,表示要从这个目录拷贝文件。include表示要拷贝的文件,因为不是src/main/resources目录,所以,只会拷贝include配置的文件。

${pkg.env}配置在profile的properties中,这样,就可以拷贝指定环境的文件。

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <pkg.env>dev</pkg.env>
        </properties>
    </profile>
    <profile>
        <id>pro</id>
        <properties>
            <pkg.env>pro</pkg.env>
        </properties>
    </profile>
</profiles>

7. 参考

include-exclue

filter

resource插件示例

本文含有隐藏内容,请 开通VIP 后查看