自 2010 年 Maven 3 发布 以来,Maven 对 Java 构建生态的整体支持方式,几乎没有发生过颠覆性的变化。

  然而在这 15 年里,Java 世界早已天翻地覆:

  • 模块化成为标配
  • 并行构建成为刚需
  • 云原生与容器化成为主流
  • JDK 以一年两个大版本的节奏持续快速演进

      相比之下,Maven 本身却显得有些“老态”。

      Maven 4 的出现,正是为了解决这些长期积累的历史包袱。

      虽然 Maven 4 仍未公布正式 GA 发布日期,但目前已经迭代到 第五个发布候选版本(RC5),从项目成熟度和变更稳定性来看,距离正式发布已相当接近。

      “

      现在正是提前了解、评估和准备升级的合适时机。

    POM 模型升级:从 4.0.0 到 4.1.0

      Maven 4 将 POM 的模型版本升级为 4.1.0:

      ini

      

       4.1.0

  • 向后兼容: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
  • 不包含未使用依赖
  • 只保留真实传递依赖
  • 属性已被解析为具体值

      开启方式:

      ini

      mvn clean install -Dmaven.consumer.pom.flatten=true

      “

      Maven 3 时代需要额外的 Flatten Maven Plugin,Maven 4 中已成为 原生能力。

      这一步,直接让依赖解析更快、更干净、更可预测。

    新 Artifact Type:显式控制 classpath / module path

      在 Maven 3 中:

  • 普通 JAR → classpath
  • 含 module-info.class → module path(自动推断)

      这种“隐式规则”在 Java 模块化时代并不够清晰。

      Maven 4 新增类型:

      lua

      classpath-jar module-jar

      开发者终于可以 显式声明依赖放在哪里。

      Maven 4 还新增了专门的注解处理器类型:

  • processor
  • classpath-processor
  • modular-processor

      以 Lombok 为例:

      xml

       org.projectlombok lombok ${lombok.version} classpath-processor org.projectlombok lombok ${lombok.version} provided

      Maven 4 明确区分了 API classpath 与 processor classpath,构建语义更清晰,也更利于工具链优化。

    Modules 改名为 Subprojects:为 Java 9 “让路”

      Java 9 引入模块系统后:

  • Maven Modules
  • Java Modules

      长期让新手和工具“集体懵逼”。

      Maven 4 的选择是:

  • modules → subprojects
  • modules 标记为 deprecated

      xml

       project-a project-b

      同时还支持:

  • Parent 推断: 空

       自动识别

  • 子项目自动发现: 无需显式声明
  • 统一构建时间戳
  • 安全发布: 子项目失败 → 全部不发布

      这是一次 语义层面 + 工程实践层面 的双重升级。

    树形生命周期:并行构建终于“名正言顺”

      Maven 3 的生命周期是 线性的,即使多模块,也很难高效并行。

      Maven 4 引入 Tree-based Lifecycle:

  • 每个子项目独立推进生命周期
  • 依赖就绪即可启动
  • 大型多模块构建速度显著提升

      开启方式:

      css

      mvn -b concurrent verify

    配置能力显著增强的“小变化”1. 条件表达式 Profile

      scss

       exists('${project.basedir}/src/**/*.xsd') && length(${user.name}) > 5

      不再只是 os.name、jdk 这种基础判断,而是 真正的表达式系统。

    2. 统一的 Sources 模型

      Maven 3:

      xml

      ... ...

      Maven 4:

      xml

       main my-custom-dir/foo test my-custom-dir/bar

      更适合:

  • 多目录
  • 多版本
  • 模块化项目
  • 无插件配置场景

      Maven 4 还提供了官方升级工具:

      bash

      mvnup check # 只生成报告 mvnup apply # 自动修改

      它会分析:

  • POM
  • 插件
  • 项目结构

      并给出 可执行的升级建议。