7

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

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

Maven-war-plugin 文档指出:

所有 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文件夹中?如果是这样,如何配置它来做到这一点?
  • 其他选择?
4

2 回答 2

12

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

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

所以,如果你想控制什么资源结束WEB-INF/classes,你需要控制什么资源结束,target/classes即以某种方式改变绑定到process-resources阶段的目标的行为,特别是Maven 资源插件resources:resources的目标。

为此,(这可能不直观),您可以在 pom 的元素中声明excludeinclude元素resources,如包含和排除文件和目录中所示。应用于默认资源目录:

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

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

<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/classesprocess-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>

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

于 2010-08-25T05:29:15.407 回答
0

有关正确配置和对该过程的良好解释,请参阅Pascal 的答案。我只是在这里直接回答这个问题:

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

是前者,webResources参数 inmaven-war-plugin只允许包含来自外部的额外资源src/main/resources。它不允许为自己配置包含/排除src/main/resources

于 2010-08-25T12:26:13.223 回答