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 文件承担两大作用:
- 存放构件构建所需的全部信息与配置,构件生成后,这类构建信息不再被需要;
- 包含依赖等信息,供依赖该构件的其他项目使用,这类下游项目称为消费方。
这让 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。
补充特性:
- 支持通过
<exclusions>排除 BOM 引入的依赖; - 支持带分类器(classifier)的 BOM 导入;
- 推荐通过
<bomClassifier>生成带分类器的 BOM,仅导入外部工程 BOM; - 导入同工程反应堆内的 BOM 会触发警告,未来版本将直接构建失败。
2.6 构建 POM 与消费方 POM 对比
|
配置内容
|
构建 POM
|
消费方 POM
|
|
模型版本
|
4.1.0
|
4.0.0
|
|
第三方依赖信息
|
✅ 包含
|
✅ 包含
|
|
POM 自定义属性
|
✅ 包含
|
❌ 不含
|
|
插件配置
|
✅ 包含
|
❌ 不含
|
|
仓库配置信息
|
✅ 包含
|
✅ 包含
|
|
项目基础信息 / 环境配置
|
✅ 包含
|
✅ 包含
|
|
部署至远程仓库
|
✅ 支持
|
✅ 支持
|
备注:
pom打包类型的构件不适用消费方 POM 精简规则,本身需保留构建与插件配置;- 部分当前仍保留在消费方 POM 的构建配置,未来可能仅保留在构建 POM 中;
- 基于条件的 Profile 无法转为 4.0.0 时,会生成 4.1.0 版本消费方 POM 并输出警告。
2.7 根目录与目录属性声明
1)根目录定义方式
Maven 4 提供两种定义项目根目录的方式:
- 传统方式:根目录下创建
.mvn文件夹,自动识别为工程根目录; - 新增方式: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> 可省略 groupId、artifactId、version,仅通过相对路径自动解析:- 简写形式:
<parent/>,默认向上级目录..查找父 POM; - 指定路径形式:
<parent><relativePath>..</relativePath></parent>。
大幅简化多项目工程 POM 冗余配置。
3.3 子项目自动发现
满足以下条件时,Maven 4 自动扫描子目录中的子项目,无需在
<subprojects>/<modules> 手动配置:- 父 POM 打包类型为
pom; - 未显式定义
<subprojects>或<modules>标签; - 子目录包含
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>
变量赋值三种方式:
- 命令行传参:
mvn verify -Drevision=4.0.1; .mvn/maven.config配置文件;- 根 POM 或父 POM 中定义属性。
灵活适配各类 CI/CD 流水线与自动化构建。
五、项目反应堆优化与修复
- 构建恢复逻辑修复:修复 Maven 3 经典 bug MNG-6863,构建失败后恢复构建时,自动重新编译依赖子项目;
- 简化恢复命令:新增
--resume/-r参数,直接从最后失败的子项目恢复构建,无需手动指定项目名; - 增量构建优化:整体构建失败时,已成功编译的子项目不会重复构建;
- 子目录构建感知:支持仅在指定子项目运行插件(如 Jetty),无需全模块执行;
- 快照版本时间戳统一:多子项目 SNAPSHOT 构件时间戳保持一致,便于版本溯源;
- 部署策略变更:默认开启
deployAtEnd=true,必须所有子项目构建成功后才统一部署,避免部分部署、部分失败的混乱场景。
使用建议:日常构建推荐使用
mvn verify,不建议用 mvn clean install。六、其他增强特性
6.1 应用架构维护
- 彻底移除自 Maven 3.2 起废弃的 Plexus 容器依赖注入;
- 清理大量废弃兼容代码,移除
${pom.*}等不规范表达式; - 升级内置超级 POM,更新核心插件默认版本;
- 若依赖超级 POM 默认插件版本,Maven 4 会输出警告,建议手动固定插件版本避免行为变更。
6.2 按日志严重级别构建失败
新增参数
--fail-on-severity / 简写 -fos,可指定日志级别(如 WARN),只要出现对应级别日志即终止构建。6.3 Profile 配置文件增强
- 可选 Profile 激活:使用
-P?xxx格式,指定不存在的 Profile 不会构建失败,仅输出提示日志; -
基于条件的 Profile 激活:
<activation>新增<condition>标签,支持表达式复杂条件激活:- 判断文件是否存在;
- 属性值对比;
- 多条件逻辑组合。
七、生命周期重大变更
7.1 生命周期由图结构改为树结构
Maven 3 生命周期是线性阶段列表,Maven 4 改为树形层级结构:
- 支持更精细的依赖阶段执行控制;
- 可跳过中间阶段,例如直接
deploy无需先执行install; - 默认行为兼容 Maven 3,启用并发构建
-b concurrent才可享受树形生命周期优势; - 并发构建下,依赖构件达到就绪阶段即可开始下游构建,无需等待整个工程阶段完成。
7.2 前置 / 后置阶段与执行顺序
- 所有生命周期阶段新增
before:xxx、after:xxx标准前置后置阶段,替代旧版零散的pre-*/post-*阶段; - 支持同阶段内执行顺序排序:
before:integration-test[100]、before:integration-test[200]; - 旧
pre-*/post-*已废弃,仅作为别名,未来会移除,禁止继续使用。
7.3 阶段执行范围行为变更
Maven 4 执行主阶段时,必定同步执行对应的 before/after 阶段。 示例:绑定到
post-clean(即 after:clean)的插件,Maven 3 执行 mvn clean 不会触发,Maven 4 执行 mvn clean 会自动触发后置阶段插件。7.4 全局 / 逐个全新阶段
新增生命周期阶段:
all、each、before:all、after:all、before:each、after:each:each:包裹单个子项目完整生命周期,用于单个项目的前后置逻辑;all:覆盖整个工程及所有子项目,用于全局一次性逻辑;before:all:整个工程构建前执行;after:all:整个工程所有子项目构建完成后执行;before:each/after:each:每个生命周期阶段前后统一执行,用于全局统一的初始化与收尾。
八、插件、安全与配套工具
8.1 Maven 插件适配
- 彻底不再兼容未适配 Maven 3 规范的老旧 Maven 2 插件;
- 依赖已移除的 Plexus DI 插件需改造为 JSR-330 依赖注入;
- 新增不可变插件模型与全新插件 API(4.0.0 仍为实验版,仅编译器插件等官方组件可使用);
- 可通过
-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 所有已修复的缺陷与功能需求。

浙公网安备 33010602011771号