Maven 资源插件忽略排除列表

问题描述

TL;博士

Maven 的Resources 插件似乎不尊重资源配置中的 excludes 元素。

设置

我有一个大型 Java/Dart 项目,我需要在其中部署一个 WAR 文件,该文件在单独的 JAR 中包含我的 UI 和后端。我想减少部署文件的大小,我想从 WAR 中删除某些文件夹。基于 plugin documentation,我想我可以简单地在我的插件配置中设置 exclude,它不会复制不必要的文件夹。然而,尽管包含 setExcludes 函数的 Maven 模型包,Resources 插件似乎完全忽略了这些。

目前的尝试

到目前为止,我已经尝试了两种主要方法。我的配置如下:

<configuration>
    <outputDirectory>${project.build.directory}/${project.build.finalName}</outputDirectory>
    <resources>
        <resource>
            <directory>src/main/webapp</directory>
            <excludes>
                <exclude>web.xml</exclude>
                <exclude>appengine-web.xml</exclude>
                <exclude>**/web/_el/*</exclude>
                <exclude>WEB-INF/pages/frontend/**</exclude>
                <exclude>**/_el/js/frontend/**</exclude>
                <exclude>**/_el/dart/app/dashboard/lib/**</exclude>
                <exclude>**/_el/dart/app/dashboard/.dart_tool/**</exclude>
            </excludes>
        </resource>
    </resources>
</configuration>

我尝试在 execution 元素内部以及 plugin 元素正下方使用此配置,但两次都被忽略,所有内容 webapp 目录被无意识地复制了。
凭直觉,我确实尝试将 filtering 设置为 true,但这只会耗尽我计算机中的所有内存,它甚至不起作用 - 它所做的过程被复制了。

我也尝试过使用 Shade 插件,但很快就放弃了,因为 DontIncludeResourceTransformer 只允许后缀过滤,这对于我的用例来说是不够的。>

问题

那我做错了什么?根据文档,我相信插件应该尊重我的 excludes 列表并跳过绝大多数文件,但它显然没有这样做。

解决方法

您需要使用 apache **maven war plugin**。 WAR 插件负责收集 Web 应用程序的所有工件依赖项、类和资源,并将它们打包到 Web 应用程序存档中。

通过使用 和 配置参数,可以在 WAR 文件中包含或排除某些文件。它们每个都采用逗号分隔的 Ant 文件集模式列表。您可以使用通配符,例如 ** 表示多个目录,使用 * 表示文件或目录名称的可选部分。

以下是我们从 WEB-INF/lib 中排除所有 JAR 文件的示例:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.3.1</version>
        <configuration>
          <packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

https://maven.apache.org/plugins/maven-war-plugin/examples/including-excluding-files-from-war.html