What's new in Maven 4?Maven 4 新特性

豆包翻译原文地址:What's new in Maven 4? – Maven
 
最后更新:2026-05-21 提示:本文将持续更新,至少更新至 Maven 4.0.0 正式发布。
Maven 已有二十余年历史,是 Java 生态中使用最广泛的构建工具。多年来 Maven 一直保持向下兼容,尤其是 4.0.0 版本的 POM 模型文件。
POM 文件承担两大作用:
  1. 存放构件构建所需的全部信息与配置,构件生成后,这类构建信息不再被需要;
  2. 包含依赖等信息,供依赖该构件的其他项目使用,这类下游项目称为消费方
这让 Maven 不再只是一款工具,而是形成了完整生态,POM 被中央仓库、各类构建工具、IDE 深度依赖。因此 POM 结构一旦变更,生态内所有参与者都必须适配或停止支持,也导致 Maven POM 语法长期固化、难以演进。
“Maven 构建模型被彻底固定后,我们很难再做迭代优化,只能停留在 Maven 3 小版本迭代,无法落地那些需要大幅调整 POM 结构的改进方案。” —— 埃尔韦・布特米(2021 年 Java 开发者大会)
为实现持续演进,Maven 4 在不破坏现有生态的前提下,将构建所需信息消费方所需信息做拆分,并带来一系列重大升级。
本文按主题分类,详解 Maven 4 的核心变更:
  • 最低要求 Java 版本
  • POM 文件变更
  • 消费方 POM
  • POM 模型版本 4.1.0
  • 模块改为子项目概念
  • 全新构件类型
  • 新增打包类型:BOM
  • 构建 POM 与消费方 POM 对比
  • 根目录与目录属性声明
  • 全新源码目录声明方式
  • 支持多种 POM 语法格式
  • 子项目功能增强
  • 自动版本推断(POM 自动推导)
  • 父项目自动推断
  • 子项目自动发现
  • 示例
  • 完整支持 CI 友好变量
  • 项目反应堆优化与问题修复
  • 其他增强特性
  • 工作流、生命周期与运行时变更
  • 应用架构维护
  • 按日志严重级别构建失败参数
  • 配置文件(Profile)功能增强
  • 基于条件的 Profile 激活
  • 生命周期变更
  • 生命周期由图结构改为树结构
  • 前置 / 后置阶段与执行顺序控制
  • 阶段执行范围行为变更
  • 全局 / 逐个阶段能力
  • Maven 插件、安全与配套工具
  • Maven 插件适配
  • 加密功能升级
  • Maven 解析器
  • Maven 交互式命令行
  • Maven 升级迁移工具
  • 问题总览

一、最低要求 Java 版本

Maven 4 运行环境强制要求 Java 17,可借助 Java 17 新语法特性与性能优化进行底层升级。
重要说明:仅运行 Maven 本身需要 Java 17;项目编译仍可沿用旧版 JDK,只需保持原有编译插件配置即可。如需切换编译 JDK,可参考 Maven 工具链使用指南。

二、POM 文件变更

2.1 消费方 POM

Maven 4 可生成精简版消费方 POM,移除消费方不需要的构建配置信息,仅将精简后的 POM 部署到远程仓库,不再上传项目原始构建用的 pom.xml
消费方 POM 是构建 POM 的扁平化精简版本,具备以下特点:
  • 不再包含父 POM 引用,所有继承配置直接解析并内嵌;
  • BOM 依赖导入被扁平化合并到依赖列表;
  • 仅保留编译、运行时范围的传递依赖;
  • 仅保留项目实际用到的依赖管理配置。
扁平化设计可让依赖项目无需引用父 POM、无需理解多模块内部结构,即可获取完整依赖信息。
该扁平化功能默认关闭,避免意外行为。如需发布精简消费方 POM,需将属性 maven.consumer.pom.flatten 设为 true;也可在 /${session.rootDirectory}/.mvn/maven-user.properties 中全局配置。

2.2 POM 模型版本 4.1.0

Maven 4 升级 POM 模型版本为 4.1.0,命名空间:http://maven.apache.org/POM/4.1.0。 4.1.0 新增部分标签与属性,同时标记部分旧配置为废弃。
为兼容生态:
  • 4.1.0 仅用于源码库中的构建 POM
  • 远程仓库(如 Maven 中央仓库)的消费方 POM 仍沿用 4.0.0,由 Maven 构建时自动生成。
兼容说明:Maven 4 可正常编译 Maven 3 4.0.0 版本的 POM 项目,若无需使用新特性,无需升级 POM 至 4.1.0。

2.3 模块改为子项目概念

Maven 项目指所有使用 Maven 构建的 Java 项目,根目录至少包含 src 源码文件夹和 pom.xml。子目录中自带 pom.xml 的 Maven 项目,称为子项目
过往需在父 POM 的 <modules> 中手动罗列子模块才能参与构建。自 Java 9 引入 Java 平台模块系统后,module 术语产生概念混淆。
Maven 4 正式更名:模块(module)改为子项目(subproject),4.1.0 模型新增 <subprojects> 标签,替代原 <modules>(旧标签仍可使用但已废弃)。
统一术语:带子项目的称为多项目工程,无子项目的称为单项目工程

2.4 全新构件类型

Maven 4 新增多种构件类型,可在依赖声明中使用,原有 jar 仍是默认类型:
  • jar:可自动适配类路径或模块路径的普通 JAR;
  • classpath-jar:强制放入类路径的 JAR;
  • modular-jar:强制放入模块路径的模块化 JAR;
  • processor:注解处理器 JAR,自动适配类路径 / 模块路径;
  • classpath-processor:强制放入注解处理器类路径;
  • modular-processor:强制放入注解处理器模块路径。
jar/processor 采用启发式规则适配路径,而带 classpath-/modular- 前缀的类型由开发者手动指定,避免自动适配不符合预期。
限制:截至 2025 年 10 月,仅 Maven 编译插件 4.0.0-beta3 及以上版本支持新类型,其他插件将逐步适配。

2.5 新增打包类型:bom

Maven 4 新增专属 bom 打包类型,专门用于物料清单 BOM 工程,区分普通父 POM 与依赖管理 BOM。
该类型仅在 4.1.0 构建 POM 中可用,构建时会自动生成兼容 Maven 3 的消费方 POM。
补充特性:
  1. 支持通过 <exclusions> 排除 BOM 引入的依赖;
  2. 支持带分类器(classifier)的 BOM 导入;
  3. 推荐通过 <bomClassifier> 生成带分类器的 BOM,仅导入外部工程 BOM
  4. 导入同工程反应堆内的 BOM 会触发警告,未来版本将直接构建失败。

2.6 构建 POM 与消费方 POM 对比

配置内容
构建 POM
消费方 POM
模型版本
4.1.0
4.0.0
第三方依赖信息
✅ 包含
✅ 包含
POM 自定义属性
✅ 包含
❌ 不含
插件配置
✅ 包含
❌ 不含
仓库配置信息
✅ 包含
✅ 包含
项目基础信息 / 环境配置
✅ 包含
✅ 包含
部署至远程仓库
✅ 支持
✅ 支持
备注
  1. pom 打包类型的构件不适用消费方 POM 精简规则,本身需保留构建与插件配置;
  2. 部分当前仍保留在消费方 POM 的构建配置,未来可能仅保留在构建 POM 中;
  3. 基于条件的 Profile 无法转为 4.0.0 时,会生成 4.1.0 版本消费方 POM 并输出警告。

2.7 根目录与目录属性声明

1)根目录定义方式

Maven 4 提供两种定义项目根目录的方式:
  1. 传统方式:根目录下创建 .mvn 文件夹,自动识别为工程根目录;
  2. 新增方式:4.1.0 模型在 <project> 标签新增布尔属性 root,设为 true 时,当前 POM 所在目录即为工程根目录。

2)官方根目录内置属性

Maven 4 新增官方内置属性,替代以往开发者通过内部属性硬编码根路径的写法,旧内部属性已废弃移除。
属性名
作用域
含义
是否必有值
${project.rootDirectory}
项目级
.mvn 文件夹或 root 属性定义的根目录
${session.topDirectory}
会话级
执行命令所在目录或 --file 指定目录
${session.rootDirectory}
会话级
顶层工程的根目录
说明:
  • project 关联项目定义,session 关联本次构建执行会话;
  • ${basedir} 仍保留,代表当前子项目自身目录,始终有值;
  • 多项目工程根目录与各子项目目录相互独立。

2.8 全新源码目录声明方式

Maven 3 仅支持单一源码 / 测试源码目录,需额外插件才能配置多源码目录:
<project>
  <build>
    <sourceDirectory>my-custom-dir/foo</sourceDirectory>
    <testSourceDirectory>my-custom-dir/bar</testSourceDirectory>
  </build>
</project>
Maven 4 新增 <sources> 统一标签,支持多源码目录、包含 / 排除过滤、多 JDK 版本适配、Java 模块目录层级配置,无需依赖第三方插件:
<project>
  <build>
    <sources>
      <source>
        <scope>main</scope>
        <directory>my-custom-dir/foo</directory>
      </source>
      <source>
        <scope>test</scope>
        <directory>my-custom-dir/bar</directory>
      </source>
    </sources>
  </build>
</project>

2.9 支持多种 POM 语法格式

消费方 4.0.0 POM 语法固定不可修改,但构建 POM 支持扩展。 Maven 4 提供 ModelParser SPI 扩展接口,可通过核心扩展实现非 XML 格式的 POM 语法,首个落地实现为 Apache Maven Hocon 格式扩展。

三、子项目功能增强

3.1 自动版本推断(POM 自动推导)

Maven 4 实现了始于 2005 年的经典需求:父项目版本自动推断。 使用 4.1.0 模型时,子项目无需手动声明父项目版本,跨子项目依赖也可省略版本号,大幅减少版本批量修改工作量。

3.2 父项目自动推断

4.1.0 模型下,子项目 <parent> 可省略 groupIdartifactIdversion,仅通过相对路径自动解析:
  1. 简写形式:<parent/>,默认向上级目录 .. 查找父 POM;
  2. 指定路径形式:<parent><relativePath>..</relativePath></parent>
大幅简化多项目工程 POM 冗余配置。

3.3 子项目自动发现

满足以下条件时,Maven 4 自动扫描子目录中的子项目,无需在 <subprojects>/<modules> 手动配置:
  1. 父 POM 打包类型为 pom
  2. 未显式定义 <subprojects><modules> 标签;
  3. 子目录包含 pom.xml 文件。

3.4 代码示例

无需声明父项目坐标、无需声明子项目依赖版本:
<project xmlns="http://maven.apache.org/POM/4.1.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.1.0 
         https://maven.apache.org/xsd/maven-4.1.0.xsd">
  <!-- 自动推断父项目所有坐标与版本 -->
  <parent/>
  <artifactId>myOwnSubprojectArtifactId</artifactId>

  <dependencies>
    <!-- 子项目间依赖省略版本号,自动推导 -->
    <dependency>
      <groupId>the.dependent.subproject.groupId</groupId>
      <artifactId>the.dependent.subproject.artifactId</artifactId>
    </dependency>
  </dependencies>
</project>

四、CI 友好变量完整支持

Maven 3.5 仅部分支持 ${revision} 等 CI 变量,需借助扁平化插件才能完整使用。 Maven 4 原生内置完整支持,无需额外插件,可自定义任意变量作为版本号。
示例:
<groupId>my.groupId</groupId>
<artifactId>my.artifactId</artifactId>
<version>${revision}</version>
变量赋值三种方式:
  1. 命令行传参:mvn verify -Drevision=4.0.1
  2. .mvn/maven.config 配置文件;
  3. 根 POM 或父 POM 中定义属性。
灵活适配各类 CI/CD 流水线与自动化构建。

五、项目反应堆优化与修复

  1. 构建恢复逻辑修复:修复 Maven 3 经典 bug MNG-6863,构建失败后恢复构建时,自动重新编译依赖子项目;
  2. 简化恢复命令:新增 --resume / -r 参数,直接从最后失败的子项目恢复构建,无需手动指定项目名;
  3. 增量构建优化:整体构建失败时,已成功编译的子项目不会重复构建;
  4. 子目录构建感知:支持仅在指定子项目运行插件(如 Jetty),无需全模块执行;
  5. 快照版本时间戳统一:多子项目 SNAPSHOT 构件时间戳保持一致,便于版本溯源;
  6. 部署策略变更:默认开启 deployAtEnd=true必须所有子项目构建成功后才统一部署,避免部分部署、部分失败的混乱场景。
使用建议:日常构建推荐使用 mvn verify,不建议用 mvn clean install

六、其他增强特性

6.1 应用架构维护

  1. 彻底移除自 Maven 3.2 起废弃的 Plexus 容器依赖注入;
  2. 清理大量废弃兼容代码,移除 ${pom.*} 等不规范表达式;
  3. 升级内置超级 POM,更新核心插件默认版本;
  4. 若依赖超级 POM 默认插件版本,Maven 4 会输出警告,建议手动固定插件版本避免行为变更。

6.2 按日志严重级别构建失败

新增参数 --fail-on-severity / 简写 -fos,可指定日志级别(如 WARN),只要出现对应级别日志即终止构建。

6.3 Profile 配置文件增强

  1. 可选 Profile 激活:使用 -P?xxx 格式,指定不存在的 Profile 不会构建失败,仅输出提示日志;
  2. 基于条件的 Profile 激活<activation> 新增 <condition> 标签,支持表达式复杂条件激活:
    1. 判断文件是否存在;
    2. 属性值对比;
    3. 多条件逻辑组合。

七、生命周期重大变更

7.1 生命周期由图结构改为树结构

Maven 3 生命周期是线性阶段列表,Maven 4 改为树形层级结构
  • 支持更精细的依赖阶段执行控制;
  • 可跳过中间阶段,例如直接 deploy 无需先执行 install
  • 默认行为兼容 Maven 3,启用并发构建 -b concurrent 才可享受树形生命周期优势;
  • 并发构建下,依赖构件达到就绪阶段即可开始下游构建,无需等待整个工程阶段完成。

7.2 前置 / 后置阶段与执行顺序

  1. 所有生命周期阶段新增 before:xxxafter:xxx 标准前置后置阶段,替代旧版零散的 pre-*/post-* 阶段;
  2. 支持同阶段内执行顺序排序:before:integration-test[100]before:integration-test[200]
  3. pre-*/post-* 已废弃,仅作为别名,未来会移除,禁止继续使用。

7.3 阶段执行范围行为变更

Maven 4 执行主阶段时,必定同步执行对应的 before/after 阶段。 示例:绑定到 post-clean(即 after:clean)的插件,Maven 3 执行 mvn clean 不会触发,Maven 4 执行 mvn clean 会自动触发后置阶段插件。

7.4 全局 / 逐个全新阶段

新增生命周期阶段:alleachbefore:allafter:allbefore:eachafter:each
  • each:包裹单个子项目完整生命周期,用于单个项目的前后置逻辑;
  • all:覆盖整个工程及所有子项目,用于全局一次性逻辑;
  • before:all:整个工程构建前执行;
  • after:all:整个工程所有子项目构建完成后执行;
  • before:each/after:each:每个生命周期阶段前后统一执行,用于全局统一的初始化与收尾。

八、插件、安全与配套工具

8.1 Maven 插件适配

  1. 彻底不再兼容未适配 Maven 3 规范的老旧 Maven 2 插件;
  2. 依赖已移除的 Plexus DI 插件需改造为 JSR-330 依赖注入;
  3. 新增不可变插件模型与全新插件 API(4.0.0 仍为实验版,仅编译器插件等官方组件可使用);
  4. 可通过 -Dmaven.plugin.validation=verbose 查看插件兼容校验日志。

8.2 加密功能升级

Maven 3 密码加密仅为简单混淆,Maven 4 全新重构加密体系:
  • 独立命令行工具 mvnenc
  • 新增解密功能;
  • 支持外部密钥仓库;
  • 保留原有加密操作逻辑,安全性大幅提升。

8.3 Maven 解析器

内置 Maven Artifact Resolver 2.0 版本:
  • 超 150 项修复、优化与功能升级;
  • 基于 Java 17 内置原生 HTTP 客户端;
  • 解析器被封装至新 API,插件不再直接依赖底层解析器。

8.4 Maven 交互式命令行

除守护进程 mvnd 外,新增 Maven Shell(mvnsh):保持常驻 Maven 进程,避免每次执行 mvn 命令重复初始化,大幅提升频繁构建的执行速度。

8.5 Maven 升级迁移工具

提供专属升级工具,一键完成 Maven 3 迁移至 Maven 4:
  • 自动升级 POM 至 4.1.0(可选);
  • 识别废弃配置并给出替换方案;
  • 迁移废弃插件配置;
  • 校验项目是否适配 Maven 4。

九、问题总览

Maven 官方问题追踪器可查看 Maven 4.0.0 所有已修复的缺陷与功能需求。
posted @ 2026-05-27 16:29  nanahome  阅读(66)  评论(0)    收藏  举报