【问题标题】:Selecting the certain resource files into WAR from the default src/main/resources location with Maven使用 Maven 从默认的 src/main/resources 位置将某些资源文件选择到 WAR 中
【发布时间】:2010-08-24 15:36:41
【问题描述】:

我正在尝试控制将哪些文件放入由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>

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

Maven-war-plugin documentation 状态:

所有 Maven 2 项目的默认资源目录是 src/main/resources,最终会在 WAR 中的 target/classes 和 WEB-INF/classes 中。目录结构将在进程中保留。

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

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

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

【问题讨论】:

  • 您是尝试使用相同的 mvn 包为不同的环境构建还是通过使用配置文件来控制它?

标签: configuration maven-2 release-builds


【解决方案1】:

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

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

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

为此,(这可能不直观),您可以在 pom 的 resources 元素内声明 excludeinclude 元素,如 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/类仍将包含 XML 文件

您在这里所做的是添加一个 additional 资源目录,这似乎是已经包含的默认资源目录。因此,无论您要排除什么,这都没有影响,因为无论如何文件在process-resources 期间被复制到target/classes,因此仍然最终在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>

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

【讨论】:

  • 我实际上尝试排除“全局”resources 元素中的文件。结果是排除的文件没有进入target/classes,但是,它们仍然进入了target/mypackage-1.0.0-SNAPSHOT。但我会再次检查以确保,也许我在那里犯了一些错字/错误:/
  • @Tuukka 嗯...是的,请仔细检查(使用干净的构建)。
  • @Pascal:重新尝试过这种方式后,它似乎可以正常工作。也许我之前犯了一个错误,对整个过程有点困惑:/所以你的建议绝对是正确的。由于illegal start of expression,我仍然无法获得Compilation failure,因为Maven 无法“识别”我在测试中使用的注释。但是,这似乎是一个常见的 Maven 问题,与排除文件无关。接下来我会尝试解决这个问题:)感谢您的支持!
  • 幸运的是,编译问题很快得到解决,原因是:jroller.com/peter_pilgrim/entry/eclipse_compiler_versus_the_sun。因此,我设法验证包装现在是否按预期进行,文件是否按预期排除。选择这个作为接受的答案。
【解决方案2】:

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 文件夹中包含文件?如果是这样,如何配置它来执行此操作?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 2013-05-11
    • 2017-02-05
    • 1970-01-01
    相关资源
    最近更新 更多