核心内容摘要
激情与代价:一次“没戴套让他C了一天”的深刻体验
自2010 年 Maven 3 发布以来Maven 对 Java 构建生态的整体支持方式几乎没有发生过颠覆性的变化。
然而在这 15 年里Java 世界早已天翻地覆模块化成为标配并行构建成为刚需云原生与容器化成为主流JDK 以一年两个大版本的节奏持续快速演进相比之下Maven 本身却显得有些“老态”。
Maven 4 的出现正是为了解决这些长期积累的历史包袱。
虽然 Maven 4 仍未公布正式 GA 发布日期但目前已经迭代到第五个发布候选版本RC5从项目成熟度和变更稳定性来看距离正式发布已相当接近。
“现在正是提前了解、评估和准备升级的合适时机。
POM 模型升级从
4.
0 到
4.
0Maven 4 将 POM 的模型版本升级为
4.
0iniproject xmlnshttp://maven.apache.org/POM/
4.
0 xmlns:xsihttp://www.w
org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/
4.
0 http://maven.apache.org/xsd/maven-
4.
1.
xsd modelVersion
4.
0/modelVersion /project向后兼容Maven 4 仍然可以构建
4.
0 的 POM新能力只对
4.
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不包含未使用依赖只保留真实传递依赖属性已被解析为具体值开启方式inimvn clean install -Dmaven.consumer.pom.flattentrue“Maven 3 时代需要额外的 Flatten Maven PluginMaven 4 中已成为 原生能力。
这一步直接让依赖解析更快、更干净、更可预测。
新 Artifact Type显式控制 classpath / module path在 Maven 3 中普通 JAR → classpath含 module-info.class → module path自动推断这种“隐式规则”在 Java 模块化时代并不够清晰。
Maven 4 新增类型luatypeclasspath-jar/type typemodule-jar/type开发者终于可以显式声明依赖放在哪里。
Maven 4 还新增了专门的注解处理器类型processorclasspath-processormodular-processor以 Lombok 为例xmldependencies 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 标记为 deprecatedxmlsubprojects subprojectproject-a/subproject subprojectproject-b/subproject /subprojects同时还支持Parent 推断空 parent / 自动识别子项目自动发现无需显式声明统一构建时间戳安全发布子项目失败 → 全部不发布这是一次语义层面 工程实践层面的双重升级。
树形生命周期并行构建终于“名正言顺”Maven 3 的生命周期是 线性的即使多模块也很难高效并行。
Maven 4 引入 Tree-based Lifecycle每个子项目独立推进生命周期依赖就绪即可启动大型多模块构建速度显著提升开启方式cssmvn -b concurrent verify配置能力显著增强的“小变化”