Maven 4 官宣:历时15年,Java构建工具迎来彻底重构

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

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

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

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

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

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

POM 模型升级:从 4.0.0 到 4.1.0

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

ini 复制代码
<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.classmodule 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.namejdk 这种基础判断,而是 真正的表达式系统。

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
  • 插件
  • 项目结构

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

相关推荐
青云计划9 小时前
知光项目知文发布模块
java·后端·spring·mybatis
Victor3569 小时前
MongoDB(9)什么是MongoDB的副本集(Replica Set)?
后端
Victor3569 小时前
MongoDB(8)什么是聚合(Aggregation)?
后端
yeyeye11110 小时前
Spring Cloud Data Flow 简介
后端·spring·spring cloud
Tony Bai11 小时前
告别 Flaky Tests:Go 官方拟引入 testing/nettest,重塑内存网络测试标准
开发语言·网络·后端·golang·php
+VX:Fegn089511 小时前
计算机毕业设计|基于springboot + vue鲜花商城系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
程序猿阿伟11 小时前
《GraphQL批处理与全局缓存共享的底层逻辑》
后端·缓存·graphql
小小张说故事12 小时前
SQLAlchemy 技术入门指南
后端·python
识君啊12 小时前
SpringBoot 事务管理解析 - @Transactional 的正确用法与常见坑
java·数据库·spring boot·后端
想用offer打牌13 小时前
MCP (Model Context Protocol) 技术理解 - 第五篇
人工智能·后端·mcp