Maven 资源插件过滤不起作用

Maven resources plugin filtering not working

我有一个包含以下内容的 POM:

<properties>
    <prop1>xxxxxxxxxx</prop1>
</properties>
<build>
    <finalName>${project.artifactId}-${project.version}</finalName>
    <resources>
        <resource>
            <directory>src/test/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
 </build>

我在 src/test/resources 下有一个属性文件:

p1=${prop1}

我的目标是将 .properties 文件复制到 target/test-classes 目录并自动更改 p1 的值。但它不起作用。它复制资源但不更改值。

问题是你配置的是主资源而不是测试资源;主要资源配置有 resource element, whereas the test resources are configured with the testResource 元素。使用当前配置,src/test/resources 下的文件将被视为已过滤的主要资源,而实际测试资源将未被过滤。这就是为什么不过滤target/test-classes下复制的属性文件。

您要找的是:

<testResources>
  <testResource>
    <directory>src/test/resources</directory>
    <filtering>true</filtering>
  </testResource>
</testResources>

这样,src/test/resources下的文件将被视为过滤后的测试资源,而主要资源将保持不变。

我在使用 Maven 属性插件的 copy-resources 目标时遇到了类似的问题。复制了资源,但未替换占位符。对我来说,这是因为犯了一个愚蠢的错误——我在早期的 Maven 阶段复制了资源 (validate),并在后期 (initialize) 阶段包含了占位符属性文件……所以这些属性尚不可用.

我将包含属性的阶段更改为 validate,将占位符包含为 initialize,一切正常。

我的工作配置如下:

在验证中包含属性文件:

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>properties-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>read-project-properties</goal>
                        </goals>
                        <configuration>
                            <files>
                                <file>${project.basedir}/path/to/placeholders.properties</file>
                            </files>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

正在复制 initialize 中的资源:

   <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <executions>
            <execution>
                <id>copy-resources</id>
                <!-- here the phase you need -->
                <phase>initialize</phase>
                <goals>
                    <goal>copy-resources</goal>
                </goals>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <outputDirectory>${project.build.directory}/classes</outputDirectory>
                    <resources>
                        <resource>
                            <directory>${basedir}/path/to/directory/with/resources/to/copy</directory>
                            <filtering>true</filtering>
                        </resource>
                    </resources>
                </configuration>
            </execution>

以下是官方参考文档中的注释: (参考https://docs.spring.io/spring-boot/docs/2.3.2.RELEASE/maven-plugin/reference/html/

请注意,由于 application.properties 和 application.yml 文件接受 Spring 样式占位符 (${... }),Maven 过滤更改为使用 @..@ 占位符. (您可以通过设置一个名为 resource.delimiter 的 Maven 属性 来覆盖它。)