变量可以包含在您的资源中。这些由${...}分隔符表示的变量可以来自系统属性、项目属性、过滤器资源和命令行。
例如,如果我们有一个资源src/main/resources/hello.txt包含
Hello ${name}像这样的POM
<project>
...
<name>My Resources Plugin Practice Project</name>
...
<build>
...
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
...
</resources>
...
</build>
...
</project>调用时
mvn resources:resources
这将在target/classes/hello.txt中创建一个包含完全相同文本的资源输出。
Hello ${name}但是,如果我们向 POM 添加一个<filtering>标记并将其设置为true,如下所示:
...
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
...我们调用后的target/classes/hello.txt
mvn resources:resources
将是
Hello My Resources Plugin Practice Project
这是因为 name 变量被项目名称的值(在 POM 中指定)替换。
此外,我们还可以使用“-D”选项通过命令行赋值。例如,要将变量名称的值更改为“world”,我们可以简单地调用以下命令:
mvn resources:resources -Dname="world"
target/classes/hello.txt中的输出将是
Hello world
此外,我们不限于使用预定义的项目变量。我们可以在<properties>元素中指定我们自己的变量及其值。例如,如果我们想将变量从“name”更改为“your.name”,我们可以通过在<properties>元素中添加<your.name>元素来实现。
<project>
...
<properties>
<your.name>world</your.name>
</properties>
...
</project>但是为了组织您的项目,您可能希望将所有变量及其值放在一个单独的文件中,这样您就不必重写您的 POM,或者在每次构建时一直设置它们的值。这可以通过添加过滤器来完成。
<project>
...
<name>My Resources Plugin Practice Project</name>
...
<build>
...
<filters>
<filter>[a filter property]</filter>
</filters>
...
</build>
...
</project>例如,我们可以通过指定过滤器文件my-filter-values.properties将“your.name”与 POM 分开,其中包含:
your.name = world
并将其添加到我们的 POM
...
<filters>
<filter>my-filter-values.properties</filter>
</filters>
...警告:不要过滤带有二进制内容的文件,如图像!这很可能会导致输出损坏。
如果您有文本文件和二进制文件作为资源,建议有两个单独的文件夹。一个文件夹src/main/resources(默认)用于未过滤的资源,另一个文件夹src/main/resources-filtered用于过滤的资源。
<project>
...
<build>
...
<resources>
<resource>
<directory>src/main/resources-filtered</directory>
<filtering>true</filtering>
</resource>
...
</resources>
...
</build>
...
</project>现在您可以将这些文件放入不应过滤的src/main/resources中,将其他文件放入src/main/resources-filtered中。
如前所述,过滤图像、pdf 等二进制文件可能会导致输出损坏。为了防止此类问题,您可以配置不会被过滤的文件扩展名。