Apache Maven 4.0.0-rc-7(2026-09-24 预发布)被官方写成「GA 前预计最后一轮 RC」,正式 4.0.0 计划在随后几周视社区反馈发布。Spring Boot 多模块项目现在适合在独立分支用 Wrapper 试跑构建与 mvnup,先别把默认 CI 从 Maven 3 整线切走。站内此前没有 RC-7 专文,下文按 GitHub Release 与 InfoQ 周报 整理相对 RC6 的实质变化,以及试跑时该盯什么。

文中命令与行为未在本地完整复现,落地前请以官方发行说明和你仓库实测为准。

相对 RC6,先看这几处

Release 里「新特性 / 改进」条目不多,和日常构建最相关的是下面这些。

AsyncDrainWriter(#12892)
并发日志时减少 PrintWriter 锁竞争。InfoQ 摘要把它描述成带非阻塞 tryLock()、用无锁 ConcurrentLinkedQueue 包一层 Consumer 的缓冲写出器。大 reactor、-T 并行构建时日志抖动,有机会从这里受益。这是运行时内部改动,一般不需要改 POM。

Reactor 排序与阶段比较性能(#12901)
优化 reactor 排序和 phase comparator(InfoQ 还点到 DefaultGraphBuilder / PhaseComparator)。模块数多、生命周期阶段多的工程,配置与调度阶段可能更快。同样无需改业务 POM。

Plexus 插件依赖注入校验(#12649)
给基于 Plexus 的插件依赖注入加了校验。老插件、自研插件若 DI 声明不干净,升级后可能更早、更清楚地报错。试跑时把「以前能糊弄过去的插件」单独跑一遍 help:describe / 目标执行。

Log API 与 mojo MDC(#12690)
日志 API 增强,并为 mojo 补 MDC。若你们靠 logger 短名做级别过滤,留意实现类 FQCN 等命名是否变化(社区讨论里提过相关行为变更)。生产流水线切日志配置前,先对一下现有 logback.xml / simplelogger 规则。

默认生命周期插件版本外置到 POM 属性(#13137)
默认绑定的生命周期插件版本改由 POM 属性管理,便于对齐与审计。升级后检查 effective-pom 里插件版本是否仍符合团队基线。

PathConflictResolver 默认开启(#12893)
路径冲突解析默认打开。依赖树里同路径冲突时,行为可能与早先 RC 不同。多模块 BOM + 业务覆盖版本的工程,应用 dependency:tree 对比一次。

mvnup:修了一大串,仍要当「辅助」用

RC-7 大量 bugfix 落在 mvnup(升级辅助) 上,例如:

  • 把 maven-war-plugin、maven-ear-plugin 纳入插件升级列表(#12685)
  • 无效 JDK 约束 '(,-1]'(#13189 / #13199)
  • jar / exec / toolchain 相关兼容(#13179)
  • 自定义 ResourceTransformer 时跳过 shade 插件升级(#12991 / #13016)
  • 有自定义 shade 配置时避免误升;JDK 版本约束与 toolchains 策略修正
  • relativePath / parent 不匹配时的 FATAL 提示,可配合 -Dmaven.maven3Personality(#13191 / #13202)
  • CI-friendly 属性、POM inliner、consumer POM、BOM import 等一批边界修复

落到 Spring 多模块工程上:可以在分支上跑 mvnup 看建议,但不要无审地把 apply 结果直接合进主干。先 diff POM,再跑全量 verify。

Spring Boot 多模块:现在试什么、避什么

建议试

  1. 用 Wrapper 钉死 RC-7,与本机全局 Maven 3 隔离。
  2. 在代表真实复杂度的聚合工程上跑:clean verify、-T 1C、带 spring-boot:repackage 的模块、集成测试模块。
  3. 重点插件冒烟:spring-boot-maven-plugin、Surefire/Failsafe、Enforcer、Flatten、git-commit-id-plugin、自研 / 冷门 Plexus 插件。
  4. 对比 Maven 3 与 RC-7 的 dependency:tree、reactor 汇总(失败项排序也有调整,#13135),确认产物坐标与 BOM 传递一致。
  5. 若使用 mvnup,只在分支 apply,人工审 POM 后再测。

安装 / 切换示例(按你环境二选一,路径以官方发行包为准):

# 发行页下载 apache-maven-4.0.0-rc-7 后,仅在当前 shell 试用
export PATH="/opt/apache-maven-4.0.0-rc-7/bin:$PATH"
mvn -v

多模块仓库里更稳妥的是 Wrapper(需你们已有或自行引入 Maven Wrapper 流程)。确认版本字符串含 4.0.0-rc-7 后再跑:

./mvnw -v
./mvnw -T 1C clean verify

建议先避开

  • 默认流水线、发布任务、中央仓部署仍留在 Maven 3.9.x(或你们现网版本),等 GA 与插件矩阵稳定后再切。
  • 把 RC-7 当成「能修一切 parent / relativePath / consumer POM 历史债」的开关。Release 里相关修复很多,但边界 case 仍在叠。
  • 未读 diff 就全量接受 mvnup apply。
  • 假设并行构建、日志、PathConflictResolver 默认策略与 RC6 完全一致。行为有变时,先对照本版 release notes 再改业务 POM。

试跑时常见信号(来自本版修复列表,非完整清单)

  • parent relativePath 报 FATAL:核对路径;提示里出现 maven.maven3Personality 时按说明排查,不要盲关校验。
  • 运行 JDK 编译不了当前 source/release:RC-7 会给出更明确错误(#12922),先对齐 Toolchain / maven.compiler.release。
  • Windows 上 exists() / missing() profile 与 glob:本版有修复(#13163),若 CI 混用 Linux/Windows,两边都要跑。
  • 并行构建下偶发 NPE / 线程问题:本版修了 ProjectIndex 线程安全等多项,仍建议用 -T 做回归。

和 Gradle 那篇的分工

同日站内已有 Gradle 9.8.0 工具链稿。Maven 4 RC-7 这边重点是 4.0 冲刺 GA 的构建器本身 与 Spring 多模块试跑策略,不展开 Java 27 Daemon 话题。

参考

— 感谢阅读 —

一起交流

分享你的思考,让讨论更进一步。