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

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

相关推荐
zopple3 小时前
常见的 Spring 项目目录结构
java·后端·spring
cjy0001115 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
小江的记录本6 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji34166 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
程序员cxuan6 小时前
人麻了,谁把我 ssh 干没了
人工智能·后端·程序员
wuyikeer7 小时前
Spring Framework 中文官方文档
java·后端·spring
Victor3568 小时前
MongoDB(61)如何避免大文档带来的性能问题?
后端
Victor3568 小时前
MongoDB(62)如何避免锁定问题?
后端
wuyikeer8 小时前
Spring BOOT 启动参数
java·spring boot·后端
子木HAPPY阳VIP9 小时前
Ubuntu 22.04 VMware 设置固定IP配置
人工智能·后端·目标检测·机器学习·目标跟踪