因公众号更改推送规则请点“在看”并加“星标”第一时间获取精彩技术分享点击关注#互联网架构师公众号领取架构师全套资料 都在这里0、2T架构师学习资料干货分上一篇2T架构师学习资料干货分享大家好我是互联网架构师自2010 年 Maven 3 发布以来Maven 对 Java 构建生态的整体支持方式几乎没有发生过颠覆性的变化。然而在这 15 年里Java 世界早已天翻地覆模块化成为标配并行构建成为刚需云原生与容器化成为主流JDK 以一年两个大版本的节奏持续快速演进相比之下Maven 本身却显得有些“老态”。Maven 4 的出现正是为了解决这些长期积累的历史包袱。虽然 Maven 4 仍未公布正式 GA 发布日期但目前已经迭代到第五个发布候选版本RC5从项目成熟度和变更稳定性来看距离正式发布已相当接近。现在正是提前了解、评估和准备升级的合适时机。POM 模型升级从 4.0.0 到 4.1.0Maven 4 将 POM 的模型版本升级为4.1.0project xmlnshttp://maven.apache.org/POM/4.1.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.1.0 http://maven.apache.org/xsd/maven-4.1.0.xsd modelVersion4.1.0/modelVersion /project向后兼容Maven 4 仍然可以构建 4.0.0 的 POM新能力只对 4.1.0 生效modelVersion理论上可以省略Maven 会从 schema 推导也就是说不升级 POM 也能用 Maven 4但升级后才能真正“吃到红利”。Build POM / Consumer POM 分离终于解决“POM 污染”这是 Maven 4最重要、也是最颠覆性的变化之一。在 Maven 3 中发布到仓库的 POM 同时包含插件配置构建细节父 POM 引用各种属性依赖使用者会被迫解析大量“与我无关”的信息。Maven 4 的解决方法是POM 扁平化Flattening。Maven 4 正式区分类型用途Build POM项目自身构建Consumer POM提供给依赖方Consumer POM 具备以下特征不包含插件配置不包含父 POM不包含未使用依赖只保留真实传递依赖属性已被解析为具体值开启方式mvn clean install -Dmaven.consumer.pom.flattentrueMaven 3 时代需要额外的 Flatten Maven PluginMaven 4 中已成为原生能力。这一步直接让依赖解析更快、更干净、更可预测。新 Artifact Type显式控制 classpath / module path在 Maven 3 中普通 JAR → classpath含module-info.class→ module path自动推断这种“隐式规则”在 Java 模块化时代并不够清晰。Maven 4 新增类型typeclasspath-jar/typetypemodule-jar/type开发者终于可以显式声明依赖放在哪里。Maven 4 还新增了专门的注解处理器类型processorclasspath-processormodular-processor以 Lombok 为例dependencies dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId version${lombok.version}/version typeclasspath-processor/type /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId version${lombok.version}/version scopeprovided/scope /dependency /dependenciesMaven 4明确区分了 API classpath 与 processor classpath构建语义更清晰也更利于工具链优化。Modules 改名为 Subprojects为 Java 9 “让路”Java 9 引入模块系统后Maven ModulesJava Modules长期让新手和工具“集体懵逼”。Maven 4 的选择是modules→subprojectsmodules标记为 deprecatedsubprojects subprojectproject-a/subproject subprojectproject-b/subproject /subprojects同时还支持Parent 推断空parent /自动识别子项目自动发现无需显式声明统一构建时间戳安全发布子项目失败 → 全部不发布这是一次语义层面 工程实践层面的双重升级。树形生命周期并行构建终于“名正言顺”Maven 3 的生命周期是线性的即使多模块也很难高效并行。Maven 4 引入Tree-based Lifecycle每个子项目独立推进生命周期依赖就绪即可启动大型多模块构建速度显著提升开启方式mvn -b concurrent verify配置能力显著增强的“小变化”1. 条件表达式 Profileconditionexists(${project.basedir}/src/**/*.xsd) length(${user.name}) 5/condition不再只是os.name、jdk这种基础判断而是真正的表达式系统。2. 统一的 Sources 模型Maven 3sourceDirectory.../sourceDirectorytestSourceDirectory.../testSourceDirectoryMaven 4sources source scopemain/scope directorymy-custom-dir/foo/directory /source source scopetest/scope directorymy-custom-dir/bar/directory /source /sources更适合多目录多版本模块化项目无插件配置场景Maven 4 还提供了官方升级工具mvnup check # 只生成报告mvnup apply # 自动修改它会分析POM插件项目结构并给出可执行的升级建议。来源xxy开源1、2T架构师学习资料干货分享2、10000TB资源阿里云盘牛逼3、基本涵盖了Spring所有核心知识点总结· END ·最后关注公众号互联网架构师在后台回复2T可以获取我整理的 Java 系列面试题和答案非常齐全。如果这篇文章对您有所帮助或者有所启发的话帮忙扫描上方二维码关注一下您的支持是我坚持写作最大的动力。求一键三连点赞、转发、在看