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