Maven资源插件过滤无法正常工作

时间:2017-01-10 20:58:42

标签: maven maven-resources-plugin

我有一个包含以下内容的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的值。但它不起作用。它复制资源但不更改值。

3 个答案:

答案 0 :(得分:6)

问题在于您正在配置主要资源而不是测试资源;主资源使用resource元素配置,而测试资源使用testResource元素配置。使用当前配置,src/test/resources下的文件将被视为已过滤的主资源,实际的测试资源将不会被过滤。这就是为什么不会过滤target/test-classes下复制的属性文件。

您正在寻找的是:

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

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

答案 1 :(得分:1)

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

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

我的工作配置如下:

在validate中包含属性文件:

            <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>

答案 2 :(得分:0)

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

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