过滤

变量可以包含在您的资源中。这些由${...}分隔符表示的变量可以来自系统属性、项目属性、过滤器资源和命令行。

例如,如果我们有一个资源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>
    ...

警告:不要过滤带有二进制内容的文件,如图像!这很可能会导致输出损坏。如果你有文本文件和二进制文件作为资源,你需要声明两个互斥的资源集。第一个资源集定义要过滤的文件,另一个资源集定义要复制的文件,如下所示:

<project>
  ...
  <build>
    ...
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>false</filtering>
        <excludes>
          <exclude>**/*.xml</exclude>
        </excludes>
      </resource>
      ...
    </resources>
    ...
  </build>
  ...
</project>