目录
[Maven 默认资源处理被覆盖](#Maven 默认资源处理被覆盖)
[检查 target/classes 目录](#检查 target/classes 目录)
前言
最近接手一个小项目打包的时候发现了问题,就是xml文件和yml文件都可以在打包的时候被打进war包内,但是html文件是不会打进war包内的。通过pom 的 build resource 的配置如下所示。
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.yml</include>
<include>**/*.*</include>
<include>templates/*.*</include>
</includes>
<filtering>false</filtering>
</resource>
问题排查
目录结构不正确
首先检查了目录结构,确保需要复制的文件或目录位于 src/main/resources/xxx下,且xxx里文件确实存在。例如下面结构检查没有错误。
src/
main/
resources/
templates/
index.html
Maven 默认资源处理被覆盖
Maven 默认会将 src/main/resources 下的所有文件复制到 target/classes。但如果你在 <build> 中显式定义了 <resources>,会覆盖默认行为,只包含你指定的 includes。
虽然自定义的 includes 包含了 **/*.*,但需要注意 <include> 是逐个匹配的,如果某个文件没有扩展名(例如 .gitkeep),*.* 不会匹配。所以为了排除干扰,可以简化配置只保留一条,如下所示。我就是这个问题,然后再打包就可以了。
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<filtering>false</filtering>
</resource>
打包插件额外排除了文件
还有一种情况可能是你的项目打包为 war,maven-war-plugin 可能会根据配置排除某些文件。检查 pom.xml 中是否有类似配置,如果有,需要移除或调整排除规则如下图所示。这种情况我不涉及。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<packagingExcludes>**/templates/**</packagingExcludes>
</configuration>
</plugin>
建生命周期未执行资源复制
如果依旧未解决,就观察 运行 mvn package 时,Maven 的生命周期包含 process-resources 阶段,该阶段会复制资源。如果你使用了 IDE 的 Build 功能(如 Eclipse 自动编译),可能没有完整执行 Maven 的打包流程,导致资源未复制。建议在命令行执行 mvn clean package,并观察输出中是否有类似提示信息如下所示,如果没有,说明资源未被识别。
[INFO] Copying 1 resource
检查 target/classes 目录
最后执行 mvn clean compile 后,查看 target/classes/templates 下是否有 HTML 文件。如果该目录下存在,说明资源已复制,问题可能在 war 打包阶段;如果不存在,说明资源复制阶段就有问题继续检查。
======================================
喜欢请点赞收藏加关注~~~ 好文分享不迷路~~~
======================================
