如何使用maven-resources-plugin将过滤后的资源包含到WEB-INF / classes中?

时间:2018-01-07 20:39:02

标签: java maven pom.xml maven-resources-plugin

我正在使用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>

2 个答案:

答案 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等进行补充配置。