Maven 4 要来了:15 年后,Java 构建工具迎来“彻底重构”

自 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:

xml 复制代码
<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                        http://maven.apache.org/xsd/maven-4.1.0.xsd">  <modelVersion>4.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•不包含未使用依赖•只保留真实传递依赖•属性已被解析为具体值

开启方式:

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 复制代码
<type>classpath-jar</type><type>module-jar</type>

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

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

•processor•classpath-processor•modular-processor

以 Lombok 为例:

xml 复制代码
<dependencies>  <dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>${lombok.version}</version>    <type>classpath-processor</type>  </dependency>    <dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>${lombok.version}</version>    <scope>provided</scope>  </dependency></dependencies>

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


Modules 改名为 Subprojects:为 Java 9 "让路"

Java 9 引入模块系统后:

•Maven Modules •Java Modules

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

Maven 4 的选择是:

•modules → subprojects •modules 标记为 deprecated

xml 复制代码
<subprojects>  <subproject>project-a</subproject>  <subproject>project-b</subproject></subprojects>

同时还支持:

•Parent 推断 :空 <parent /> 自动识别•子项目自动发现 :无需显式声明•统一构建时间戳 •安全发布:子项目失败 → 全部不发布

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


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

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

Maven 4 引入 Tree-based Lifecycle:

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

开启方式:

css 复制代码
mvn -b concurrent verify

配置能力显著增强的"小变化"

1. 条件表达式 Profile

scss 复制代码
<condition>  exists('${project.basedir}/src/**/*.xsd')  && length(${user.name}) > 5</condition>    

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

2. 统一的 Sources 模型

Maven 3:

xml 复制代码
<sourceDirectory>...</sourceDirectory><testSourceDirectory>...</testSourceDirectory>

Maven 4:

xml 复制代码
<sources>  <source>    <scope>main</scope>    <directory>my-custom-dir/foo</directory>  </source>  <source>    <scope>test</scope>    <directory>my-custom-dir/bar</directory>  </source></sources>

更适合:

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


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

bash 复制代码
mvnup check   # 只生成报告mvnup apply   # 自动修改

它会分析:

•POM•插件•项目结构

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

相关推荐
刚子编程5 小时前
我用 ASP.NET Core 做了个水稻病虫害检查系统
后端·asp.net
谢亮_vipxieliang5 小时前
用 PHP 构建轻量级 REST API:从路由到鉴权的完整实践
开发语言·后端·php
码事漫谈8 小时前
三步改掉 AI 味,附可直接复制的去 AI 味提示词
后端
IT_陈寒8 小时前
Redis卡顿的锅,这次真不是大key的错
前端·人工智能·后端
可乐鸡翅yeah_8 小时前
video.js 集成 hls.js 开发 M3U8 播放器,新手高频踩坑
开发语言·前端·javascript·后端·ecmascript·m3u8·音视频在线播放
程序猿_极客8 小时前
【免费】分享一套优质的基于SpringBoot的服装商城管理系统的设计与实现(带可视化图表、协同过滤功能),源码+文档+视频详解(讲解)
java·spring boot·后端·服装商城管理系统
明月_清风9 小时前
面对陌生的 GitHub 项目无从下手?这 4 个网站帮你快速读懂源码
前端·后端·github
bug菌9 小时前
🤔同事突然问我:Spring的注解 @Component 和 @Service 有何不同?
java·spring boot·后端
leobertlan9 小时前
痛苦系列 | DSP-02 频域切片:DTFT与DFT的探索
android·后端