Maven构建未复制全部资源文件 新增后缀资源未输出到target目录
问题根因
现有配置和操作存在3个直接导致资源复制失败的问题,另有1个配置隐患:
- 资源匹配规则错误:
<include>标签内的*.后缀是单级通配符,仅能匹配src/main/resources目录第一层的文件,无法识别子目录内的同后缀文件 - 构建缓存未清理:IDE内的「Update Maven Project」仅同步依赖和配置,不会清空历史构建产物,新增的匹配规则不会触发全量资源复制
- 输出路径配置不符合常规逻辑:
<targetPath>../</targetPath>会将资源输出到target/classes的上两级(即项目根目录,和target文件夹同级),很容易出现找错输出位置的情况 - 配置隐患:maven-jar-plugin中重复定义了两次
classpathPrefix,后写入的./lib/会覆盖前序的../lib/配置,运行时会出现依赖找不到的问题
修复步骤
- 替换
<build>标签下的resources配置块,改用多级通配符匹配所有层级的文件,无特殊需求不要自定义targetPath,资源会默认输出到target/classes路径,打包时自动归入类路径:
<resources> <resource> <directory>${basedir}/src/main/resources</directory> <includes> <!-- ** 表示匹配任意层级的目录,覆盖根目录和所有子文件夹下的对应后缀文件 --> <include>**/*.properties</include> <include>**/*.bat</include> <include>**/*.xml</include> <include>**/*.sh</include> <include>**/*.txt</include> <include>**/*.sql</include> </includes> </resource> </resources>
如果你确实需要把资源输出到项目根目录和target文件夹同级,可以在
<resource>标签内加回<targetPath>../</targetPath>配置。
- 修正maven-jar-plugin的重复配置,删除重复的
<classpathPrefix>../lib/</classpathPrefix>行,仅保留一个有效的类路径前缀配置。 - 执行Maven清理命令清除旧构建缓存,不要仅依赖IDE的更新功能:
mvn clean - 清理完成后执行
mvn compile或者重新触发项目构建,即可在对应输出目录看到所有后缀的资源文件。
补充说明
如果需要保留.sh脚本的可执行权限、或者出现资源文件乱码问题,可以额外配置maven-resources-plugin指定文件编码和权限规则,无特殊需求无需额外配置。
内容的提问来源于stack exchange,提问作者haosmark
相关产品推荐
相关产品推荐

