Maven 4 资源复制到了项目根目录:检查 targetPath 的解析基准
同一份资源配置在旧 Maven 4 快照中把相对 targetPath 放到项目目录。明确输出目录可作为受控兼容写法,但要分清主资源与测试资源。
同一份 maven-resources-plugin 配置,在 Maven 3.9.x 把资源放到 target/classes/target-dir,换成旧 Maven 4 快照后却落到项目根下的 target-dir。若资源源目录与插件版本没有变,应检查模型中的相对 targetPath 按哪个目录解析。
这条具体故障出现在 2025 年 11 月的 Maven 4.0.0-SNAPSHOT。不能把它当成所有 Maven 4 的既定行为:4.0.0-rc-6 的正式预发行源码已经在相应构造器中保留目标路径本身,而不提前按项目基目录拼接。
明确资源真正要进入的目录
若正在维护受影响快照,且资源目标确实位于主输出目录内,可以显式写出基准。下面是合并到已有 build/resources 的片段:
<resource>
<directory>${project.basedir}/rest</directory>
<targetPath>${project.build.outputDirectory}/target-dir</targetPath>
<includes>
<include>**/*.yml</include>
</includes>
</resource>
路径和匹配规则是示例。project.build.outputDirectory 通常对应主类与资源输出,而测试资源应按它自己的测试输出目录处理;不能给所有资源机械加同一个前缀。父 POM 或 profile 已自定义输出目录时,应沿用实际求值结果。
这条写法解决的是目标位置的歧义,不会修复源目录不存在、过滤表达式错误或插件未执行。也不要把正确的源 directory 改成目标输出目录,造成下一次构建又把旧产物当输入。
升级后用干净输出验证真实包内容
采用后续 Maven 4 版本时,核对实际版本与所用插件,使用同一份最小资源配置回归;rc 是预发行标识,不应称作 GA。若原来的相对路径已经按预期工作,就不必继续为旧快照故障添加补丁。
保留旧构建日志与配置后,在可重建的本项目输出中验证,避免根目录遗留的 target-dir 让后续检查误判。不要先递归删除名称相同的目录,里面可能混有手工文件,应确认内容与用途再处理。
验收不仅看日志说复制了多少文件,还要检查资源实际位置及最终 JAR 中的相对条目。预期在类路径下的文件,应能从对应资源入口读取;测试资源不应意外进入正式包。主资源和测试资源各自验证,才能确认路径基准和打包结果都正确。


