使用Maven从默认的src / main / resources位置选择某些资源文件到WAR中

时间:2010-08-24 15:36:41

标签: configuration maven-2 release-builds

我正在尝试控制哪些文件进入由mvn package目标创建的WAR包中。具体来说,我想从每个包的默认src/main/resources文件夹中排除一些文件(我正在尝试为不同的环境进行构建/包)。

我尝试使用maven-war-plugin但失败了。如果我添加此配置(用于测试):

<webResources>
    <resource>
        <directory>src/main/resources</directory>
        <targetPath>WEB-INF/classes</targetPath>
        <excludes>
            <exclude>*.xml</exclude>
        </excludes>
    </resource>
</webResources>

...我的WEB-INF/classes仍将包含XML文件。这是因为webResources参数似乎复制了复制过程(上述配置实际上有效,文件不会被复制......但是它们会被复制到某些其他进程中)。

Maven-war-plugin documentation州:

  

所有Maven 2项目的默认资源目录是src / main / resources,它们将最终出现在目标/类和WAR中的WEB-INF / classes中。目录结构将在此过程中保留。

     

WAR插件还能够通过webResources参数包含默认资源目录中找不到的资源。

这有点令人困惑。这是否意味着:

  • webResources参数是maven-war-plugin中的一项功能,它允许从src/main/resources文件夹外部包含文件?如果是这样,我们如何从src/main/resources
  • 中更改复制的文件
  • webResources参数是maven-war-plugin中的一项功能,允许从src/main/resources文件夹外部包含 文件?如果是这样,如何配置它?
  • 其他一些选择?

2 个答案:

答案 0 :(得分:12)

  

我正在尝试控制哪些文件进入由mvn包目标创建的WAR包中。具体来说,我想从每个包的默认src / main / resources文件夹中排除一些文件

process-resources阶段,默认资源目录(src/main/resources)中的资源被复制到构建输出目录(target/classes)中。然后,在package阶段,target/classes的内容被采用并打包到分布式存档中,如WAR,并在这种情况下以WEB-INF/classes结束。

所以,如果你想控制最终在WEB-INF/classes中的资源,你需要控制哪些资源最终会在target/classes中,即以某种方式改变the goal bound to the process-resources phase的行为,特别是Maven Resources Pluginresources:resources目标。

要这样做,(这可能不直观),您可以在pom的exclude元素内声明includeresources个元素,如Including and excluding files and directories所示。应用于默认资源目录:

<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <excludes>
        <exclude>**/*.xml</exclude>
      </excludes>
    </resource>
  </resources>
</build>

如果您想对不同的环境使用自定义排除规则,请将其与profiles结合使用。例如:

<project>
  ...
  <profiles>
    <profile>
      <id>env-uat</id>
      <activation>
        <property>
          <name>env</name>
          <value>uat</value>
        </property>
      </activation>
      <build>
        <resources>
          <resource>
            <directory>src/main/resources</directory>
            <excludes>
              <exclude>**/*.xml</exclude>
            </excludes>
          </resource>
        </resources>
      </build>
    </profile>
  </profiles>
</project>

使用此配置文件时,xml文件不会以target/classes结尾,因此在最后一场战争中它们不会以WEB-INF/classes结尾。

  

我尝试使用maven-war-plugin但失败了。如果我添加此配置(用于测试)(...),我的WEB-INF / classes仍将包含XML文件

您在此处执行的操作是添加其他资源目录,该目录似乎是已包含的默认资源目录。因此,无论您要排除什么,这都无效,因为文件在target/classes期间无论如何都会被复制到process-resources,因此仍会在WEB-INF/classes中结束。

换句话说,如果要添加不属于默认资源目录的额外资源,请使用webResources

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <webResources>
            <resource>
              <!-- this is relative to the pom.xml directory -->
              <directory>extra-resources</directory>
            </resource>
          </webResources>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

但我不认为这是你在这里寻找的,并建议使用上面建议的方法。

答案 1 :(得分:0)

Pascal's answer for right configuration and good explanation of the process。我在这里直接回答这个问题:

  
      
  • webResources参数是maven-war-plugin中的一项功能,它允许从src / main / resources文件夹外部包含文件?如果是这样,我们如何改变src / main / resources中的复制文件?
  •   
  • webResources参数是maven-war-plugin中的一个功能,它允许从src / main / resources文件夹外部包含 文件?如果是这样,如何配置它?
  •   

这是前者,webResources中的maven-war-plugin参数只允许从src/main/resources外部包含额外的资源。它允许为src/main/resources本身配置包含/排除。