我正在使用maven-resources-plugin,因为在进行过滤时我需要使用自定义分隔符。我的神器是一个WAR。
我的src/main/resources
目录中有一些资源。通常,在打包WAR时,此目录中的任何内容都会以WEB-INF/classes
结尾。但我需要先过滤这些资源,然后将然后放入WEB-INF/classes
目录。我很难配置maven-resources-plugin来做到这一点。有办法吗?
我的POM看起来像这样:
<build>
<finalName>my-app</finalName>
<filters>
<filter>${basedir}/src/main/properties/base.properties</filter>
</filters>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<overwrite>true</overwrite>
<useDefaultDelimiter>false</useDefaultDelimiter>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<outputDirectory>${project.build.directory}</outputDirectory>
<resources>
<resource>
<directory>
${basedir}/src/main/resources
</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
答案 0 :(得分:1)
阶段错误,validate
是第二阶段,应仅用于验证构建环境,并且在默认process-resources
阶段之前,因此您的正确文件将被覆盖。
基本上,您有两个选项可以解决您的问题:
如果你真的需要不同的行为。
在这种情况下,你的阶段是错误的。会发生什么:
process-resources
中,default-resources
执行资源插件会运行目标copy-resources
,这会在未过滤状态下再次覆盖已过滤的资源。如果您真的想这样做,请将资源放入与src/main/resources
不同的目录中,将执行阶段更改为稍微合适(不要混淆)并且还请更改ID执行(类似于copy-specially-filtered-resource
- id可以用来解释为什么需要第二次执行)
此外,输出目录错误(需要:${project.build.outputDirectory}
,directory
仅指向目标文件夹。
<build>
<finalName>my-app</finalName>
<filters>
<filter>${basedir}/src/main/properties/base.properties</filter>
</filters>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<id>copy-special-resources</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<overwrite>true</overwrite>
<useDefaultDelimiter>false</useDefaultDelimiter>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
<resources>
<resource>
<directory>
${basedir}/src/main/filtered
</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
此外,在这种情况下,我也会将过滤器放入执行配置中(其他一切都会产生误导)。
更简单,更简单的方法是简单地重新配置资源插件,全局激活资源过滤并使用默认执行(但是,这也将对测试资源有效):
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<finalName>my-app</finalName>
<filters>
<filter>${basedir}/src/main/properties/base.properties</filter>
</filters>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<useDefaultDelimiter>false</useDefaultDelimiter>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
</configuration>
</plugin>
</plugins>
</build>
提示:使用override
配置通常是一种气味......
答案 1 :(得分:0)
首先,为什么不阅读maven-war-plugin
的文档根据文档,您可以定义configuration to use a supplemental directory and activate filtering for that directory like this:
<configuration>
<filters>
<filter>properties/config.prop</filter>
</filters>
<nonFilteredFileExtensions>
<!-- default value contains jpg,jpeg,gif,bmp,png -->
<nonFilteredFileExtension>pdf</nonFilteredFileExtension>
</nonFilteredFileExtensions>
<webResources>
<resource>
<directory>resource2</directory>
<!-- it's not a good idea to filter binary files -->
<filtering>false</filtering>
</resource>
<resource>
<directory>configurations</directory>
<!-- enable filtering -->
<filtering>true</filtering>
<excludes>
<exclude>**/properties</exclude>
</excludes>
</resource>
</webResources>
</configuration>
我建议您创建一个补充目录,例如src/main/filtered-resources
,您配置为进行过滤,默认资源目录我不会更改(默认情况下不进行过滤)。这使它更容易理解。
如果要更改分隔符,可以将配置添加到maven-war-plugin,如下所示:
<delimiters>
<delimiter>@</delimiter>
</delimiters>
所以最后不需要为maven-resources-plugin等进行补充配置。