maven 默认过滤器目录的好处

use*_*112 5 java maven

最近发现了maven资源过滤,在文档中看到了一个注释:

标准目录布局
src/main/filters 资源过滤文件

我注意到 maven<filter>默认不搜索此目录中tag 中声明的文件。那么在这种情况下坚持使用 Maven Layout 有什么好处(当然结构一致性除外)?

dur*_*dur 6

src/main/filters目录包含过滤器而不是要过滤的文件。Maven 无法自动搜索过滤器,因为它不知道要使用哪些过滤器。

\n

请参阅Maven:完整参考

\n
\n

src/main/filters 中的default.properties。

\n
jdbc.url=jdbc:hsqldb:mem:mydb\njdbc.username=sa\njdbc.password=\n
Run Code Online (Sandbox Code Playgroud)\n

要使用此default.properties文件配置资源过滤,我们需要在project\xe2\x80\x99s POM中指定两件事:filters构建配置元素中的属性文件列表,以及向Maven表示资源目录的标志是要过滤的。默认的 Maven 行为是跳过过滤,仅将资源复制到输出目录;你\xe2\x80\x99需要显式配置资源过滤器,否则Maven将完全跳过该步骤。此默认设置可确保 Maven\xe2\x80\x99s 资源过滤功能不会\xe2\x80\x99s 突然出现并破坏任何${...}不\xe2\x80\x99 不希望其替换的

\n

过滤资源(替换属性)。

\n
<build>\n    <filters>\n        <filter>src/main/filters/default.properties</filter>\n    </filters>\n    <resources>\n        <resource>\n            <directory>src/main/resources</directory>\n            <filtering>true</filtering>\n        </resource>\n    </resources>\n</build>\n
Run Code Online (Sandbox Code Playgroud)\n
\n


ari*_*iro 5

基本上,您假设src/main/filters(或src/test/filters)中存在的文件本身是可过滤的。这种假设是不正确的。

src/main/filters文件夹的目的是包含 Maven 在过滤操作期间将使用的资源过滤器文件。

例如,假设您定义了以下属性:

<project>
...
<properties>
    <my.property>foo</my.property>
</properties>
...
</project>
Run Code Online (Sandbox Code Playgroud)

现在假设您正在过滤某个文件夹:

...
<resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
</resource>
...
Run Code Online (Sandbox Code Playgroud)

根据该定义,src/main/resources中包含${my.property} 的任何文件都将被foo替换。

现在想象一下,您不想每次添加新属性时都更改 POM。

然后是src/main/filters起作用的时候。您不是将属性放在 POM 中,而是在src/main/filters下创建一个包含属性的文件,并向 POM 添加过滤器:

<project>
    ...
    <name>Some Project</name>
    ...
    <build>
        ...
        <filters>
            <filter>my-filter.properties</filter>
        </filters>
        ...
    </build>
    ...
</project>
Run Code Online (Sandbox Code Playgroud)