大家好我是Java1234_小锋老师。一、为什么 Maven 4 等了这么久如果你用 Java 做项目Maven 大概率不陌生。2004 年 Maven 2 发布2010 年 Maven 3 上线——之后十多年社区一直在 3.x 小版本上迭代。不是团队偷懒而是POM 文件背负了太多东西既要描述怎么构建又要告诉下游怎么依赖我。一旦改 POM 格式Maven Central、IDE、Gradle 互操作、各类插件都要跟着动。于是 POM 4.0.0 的语法几乎被冻住了很多 2005 年就提过的改进比如自动推断父 POM 版本一直拖到现在。Maven 4 的思路很直白把构建用的 POM和给别人用的 POM分开。构建时可以大胆进化发布到仓库时仍保持兼容。这才是标题里彻底重构的真正含义——不是换皮而是把底层架构理顺了。二、Maven 4 现在走到哪一步了截至 2026 年 7 月Maven 4 已发布多个 RCRelease Candidate版本最新为4.0.0-rc-52025-11-13。官方仍标注为测试用途生产环境建议等 GA 正式版。几个硬性变化需要提前知道项目Maven 3.xMaven 4运行 Maven 本身Java 8Java 17编译项目代码自行配置仍可编译 Java 8/11/17 等POM 模型4.0.0构建可用4.1.0依赖解析Resolver 1.xResolver 2.0注意Java 17 只是运行 Maven 的要求不代表你的项目必须升到 Java 17。老项目照样可以用 Toolchains 指定编译 JDK。三、核心变化Build POM 与 Consumer POM 分离这是 Maven 4 最重要的架构调整。Build POM存在 Git 仓库里包含插件配置、属性、父 POM 引用等完整信息。Consumer POM发布到 Maven Central 的精简版只保留下游真正需要的依赖信息。构建完成后Maven 4 会自动从 Build POM 生成 Consumer POM。Consumer POM 会去掉 parent 引用继承内容已内联、去掉插件配置、只保留实际用到的依赖。构建与发布流程是否开发者提交 Build POMMaven 4 本地构建执行 deploy?自动生成 Consumer POM上传到 Maven Central本地仓库保留构建产物其他项目下载 Consumer POM 解析依赖如何开启 Consumer POM 发布在 rc-5 中Consumer POM 扁平化默认关闭需要显式开启!-- .mvn/maven-user.properties --maven.consumer.pom.flattentrue或在命令行传递mvn deploy-Dmaven.consumer.pom.flattentrue四、POM 4.1.0少写重复配置升级到 POM 模型 4.1.0 后很多复制粘贴式的配置可以删掉了。Maven 3 的 4.0.0 POM 仍然能正常构建不升级也不影响。1. 父 POM 版本自动推断2005 年的老需求Maven 4 终于内置了。子模块不必再写versionprojectxmlnshttp://maven.apache.org/POM/4.1.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.1.0 https://maven.apache.org/xsd/maven-4.1.0.xsd!-- 省略 versionMaven 自动从父目录推断 --parentgroupIdcom.example/groupIdartifactIdmy-app-parent/artifactId/parentartifactIdmy-service/artifactIddependencies!-- 同仓库子模块依赖也可省略 version --dependencygroupIdcom.example/groupIdartifactIdmy-common/artifactId/dependency/dependencies/project2. 子模块自动发现父 POM 使用pom打包且没有手动写subprojects时Maven 4 会自动扫描子目录里的pom.xmlprojectxmlnshttp://maven.apache.org/POM/4.1.0modelVersion4.1.0/modelVersiongroupIdcom.example/groupIdartifactIdmy-app-parent/artifactIdversion1.0.0-SNAPSHOT/versionpackagingpom/packaging!-- 不写 subprojects子目录有 pom.xml 就会自动加入构建 --/project3. CI 友好版本号不再需要 Flatten 插件Maven 3 时代常用${revision}配合 flatten-maven-plugin。Maven 4 内置完整支持groupIdcom.example/groupIdartifactIdmy-app/artifactIdversion${revision}/version# 在 CI 流水线中指定版本mvn verify-Drevision1.2.0或在.mvn/maven.config中固定-Drevision1.0.0-SNAPSHOT4. 新的 BOM 打包类型BOMBill of Materials有了专属packaging类型和 parent POM 职责分得更清楚projectxmlnshttp://maven.apache.org/POM/4.1.0modelVersion4.1.0/modelVersiongroupIdcom.example/groupIdartifactIdmy-app-bom/artifactIdversion1.0.0/versionpackagingbom/packagingdependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion3.4.0/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagement/project5. 多源码目录告别 Build Helper 插件buildsourcessourcescopemain/scopedirectorysrc/main/java/directory/sourcesourcescopemain/scopedirectorysrc/main/kotlin/directory/sourcesourcescopetest/scopedirectorysrc/test/java/directory/source/sources/build五、新工具与日常体验升级Maven Upgrade Toolmvnup官方提供的迁移助手先检查、再自动修复# 检查项目与 Maven 4 的兼容问题mvnup check# 自动应用推荐的 POM 修复mvnup applyMaven Shellmvnsh类似 REPL 的交互式 Shell改完代码不用反复敲完整命令mvnsh# 进入交互模式后mvncompile mvntest-plmy-service mvnexit构建失败后一键续跑多模块项目构建失败后Maven 4 的-r--resume更聪明——会自动从失败模块续跑并跳过已成功构建的模块# 首次全量构建mvn verify# 修复代码后从失败处继续mvn verify-r迁移决策流程否是是否是否准备迁移 Maven 4本机 Java 17?安装 JDK 17 作为 Maven 运行环境下载 Maven 4.0.0-rc-5运行 mvnup check有问题?mvnup apply 或手动升级插件mvn verify 验证构建构建成功?逐步在 CI 中切换加 -e 参数查看堆栈, 提 Issue 或回退六、从 Maven 3 迁移可以怎么做不必一步到位。比较稳妥的路径本地先试装 Maven 4 RC JDK 17跑mvnup check。升级插件enforcer、shade、remote-resources 等插件升到最新版。固定插件版本Maven 4 的 Super POM 默认插件版本有变化建议在 POM 里显式写死版本避免没改代码构建行为却变了。CI 并行验证保留 Maven 3 流水线新增一条 Maven 4 试验线。等 GA 再全面切换RC 阶段适合尝鲜和反馈生产环境建议等正式版。一个最小验证示例# 下载并解压 Maven 4curl-L-Ohttps://archive.apache.org/dist/maven/maven-4/4.0.0-rc-5/binaries/apache-maven-4.0.0-rc-5-bin.tar.gztar-xzfapache-maven-4.0.0-rc-5-bin.tar.gz# 指定 Maven 4 运行不影响系统默认 Maven 3/path/to/apache-maven-4.0.0-rc-5/bin/mvn-version# 在项目目录检查兼容性/path/to/apache-maven-4.0.0-rc-5/bin/mvnup check七、写在最后Maven 4 不是简单地把版本号从 3 改成 4。它用Build POM / Consumer POM 分离解开了 POM 格式冻结的死结用POM 4.1.0把十多年来社区的呼声落到了代码里还带来了 mvnup、mvnsh、Resolver 2.0 等实打实的体验提升。如果你现在项目跑在 Maven 3 上很稳不必焦虑——Maven 3 还会维护一段时间。但如果你正在维护大型多模块项目、受够了重复的版本号维护、或者在 CI 里被 flatten 插件折腾过现在正是关注 Maven 4 的好时候。GA 正式版应该不远了。在那之前不妨拿一个非核心项目跑通mvnup check亲身感受一下这次15 年后的彻底重构到底改了什么。