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

Tuu*_*nen 7 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>
Run Code Online (Sandbox Code Playgroud)

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

Maven-war-plugin文档说明:

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

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

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

  • webResources参数是maven-war-plugin中的一项功能,它允许文件包含在外部src/main/resources文件夹中?如果是这样,我们如何从内部改变复制的文件src/main/resources
  • webResources参数是Maven的战争插件,使文件的功能将包括从外部src/main/resources文件夹?如果是这样,如何配置来执行此操作?
  • 还有其他选择吗?

Pas*_*ent 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阶段的目标的行为,特别resources:resourcesMaven Resources Plugin的目标.

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

<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <excludes>
        <exclude>**/*.xml</exclude>
      </excludes>
    </resource>
  </resources>
</build>
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

使用此配置文件时,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>
Run Code Online (Sandbox Code Playgroud)

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