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 属性 来覆盖它。)
我有一个包含以下内容的 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 属性 来覆盖它。)