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

👉 这是一个或许对你有用 的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:

👉这是一个或许对你有用的开源项目

国产Star破10w的开源项目,前端包括管理后台、微信小程序,后端支持单体、微服务架构

RBAC权限、数据权限、SaaS多租户、商城 、支付、工作流、大屏报表、ERP、CRMAI大模型、IoT物联网等功能:

【国内首批】支持 JDK17/21+SpringBoot3、JDK8/11+Spring Boot2双版本


Maven 3 发布于 2010 年。15 年过去了,Java 世界天翻地覆------模块化成标配、并行构建成刚需、云原生成主流、JDK 一年两个大版本------但 Maven 本身几乎没动过。

Maven 4 就是来还这 15 年的技术债的。

目前已迭代到 RC5(第五个发布候选版本) ,虽然还没 GA,但从变更稳定性来看,正式发布已近在眼前。现在是提前了解和准备升级的最佳时机。

POM 模型升级到 4.1.0:不升也能用,但升了才有红利

go 复制代码
<project xmlns="http://maven.apache.org/POM/4.1.0">
  <modelVersion>4.1.0</modelVersion>
</project>
  • 完全向后兼容 :Maven 4 能构建 4.0.0 的 POM

  • 新能力只对 4.1.0 生效

  • modelVersion 可以省略,Maven 从 schema 自动推导

说白了: 不改 POM 也能跑 Maven 4,但不升级就是白装。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

Build POM / Consumer POM 分离:最重要的一刀

这是 Maven 4 最颠覆性的变化

Maven 3 的痛点:发布到仓库的 POM 包含插件配置、构建细节、父 POM 引用、各种属性------依赖你的项目被迫解析大量"与我无关"的信息。这就是所谓的 POM 污染

Maven 4 把 POM 一分为二:

类型 用途
Build POM 项目自身构建用
Consumer POM 提供给依赖方,干干净净

Consumer POM 不包含插件配置、父 POM、未使用依赖,属性全部解析为具体值。

go 复制代码
mvn clean install -Dmaven.consumer.pom.flatten=true

Maven 3 时代需要额外装 Flatten Maven Plugin,Maven 4 直接内置了。 依赖解析更快、更干净、更可预测。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

新 Artifact Type:classpath 和 module path 终于能显式控制

Maven 3 的规则是:普通 JAR 走 classpath,有 module-info.class 走 module path------全靠自动推断。Java 模块化时代,这种"隐式规则"经常让人踩坑。

Maven 4 新增显式声明:

go 复制代码
<type>classpath-jar</type>
<type>module-jar</type>

注解处理器也有了专用类型(processorclasspath-processormodular-processor)。拿 Lombok 举例:

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

API classpath 与 processor classpath 明确分离, 构建语义更清晰,工具链优化也有了基础。

Modules 改名 Subprojects:跟 Java 9 的"撞名"终于解决了

Maven 的 modules 和 Java 9 的 modules 长期让人"集体懵逼"。Maven 4 做了果断选择:

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

旧的 modules 标记废弃。同时还带来了几个实用改进:

  • Parent 自动推断 :空 <parent /> 自动识别

  • 子项目自动发现 :不用挨个声明

  • 统一构建时间戳

  • 安全发布 :一个子项目失败 → 全部不发布

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

Maven 3 的生命周期是线性的,多模块并行效率很低。Maven 4 引入 Tree-based Lifecycle ------每个子项目独立推进,依赖就绪即可启动,大型多模块构建速度显著提升。

go 复制代码
mvn -b concurrent verify

两个"小变化",实际影响不小

1. 条件表达式 Profile

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

不再只有 os.namejdk 这种基础判断,而是真正的表达式系统

2. 统一的 Sources 模型

Maven 3 只能指定一个源目录,Maven 4 支持多目录声明:

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

多目录、多版本、模块化项目终于不用靠插件 hack 了。

官方升级工具:两行命令搞定迁移评估

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

自动分析 POM、插件、项目结构,给出可执行的升级建议。如果你管着一堆 Maven 项目,这个工具省的时间比你想的多。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,"长按 "或"扫描"下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

go 复制代码
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
相关推荐
软件开发技术2 小时前
最新在线留言板系统PHP源码
开发语言·php·留言板系统php源码
水云桐程序员2 小时前
用C语言开发单片机项目的工作思路
c语言·开发语言·单片机
Yungoal2 小时前
c++迭代器
开发语言·c++
zhanghongbin012 小时前
Remote Write:高效数据推送
java·人工智能
云和数据.ChenGuang2 小时前
鸿蒙 HarmonyOS 6 技术全景解析:AI 原生重构全场景智能体验
人工智能·重构·harmonyos
阿丰资源2 小时前
java项目-基于SpringBoot+MySQL+Vue的前后端分离宠物商店系统(附资料)
java·spring boot·mysql
zhangzeyuaaa2 小时前
Python 闭包详解
开发语言·python
ん贤2 小时前
Go GC 非玄学,而是 CPU 和内存的权衡
开发语言·后端·golang·性能调优·gc
G探险者2 小时前
LiteFlow 技术介绍
java·开发语言