TL;DR
Maven的Resources插件似乎不尊重资源配置中的excludes
元素。
设置
我有一个大型Java/Dat项目,需要部署一个WAR文件,该文件将我的UI和后端都放在单独的JAR中。我想减少部署文件的大小,并且我想从WAR中删除某些文件夹。根据插件文档,我认为我可以在插件配置中简单地设置exclude
s,它不会复制不必要的文件夹。然而,Resources插件似乎完全忽略了这些,尽管Maven模型包包含setExcludes
函数。
当前尝试次数
到目前为止,我已经尝试了两种主要方法。我的配置如下:
<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