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 复制代码
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
相关推荐
许彰午6 小时前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
Bat U7 小时前
JavaEE|多线程初阶(七)
java·开发语言
谭欣辰7 小时前
C++ 排列组合完整指南
开发语言·c++·算法
foundbug9998 小时前
自适应滤除直达波干扰的MATLAB实现
开发语言·算法·matlab
XDH_CS8 小时前
MySQL 8.0 安装与 MySQL Workbench 使用全流程(超详细教程)
开发语言·数据库·mysql
小短腿的代码世界9 小时前
Qt实时盈亏计算深度解析:从持仓数据到动态盈亏展示
开发语言·qt
小康小小涵9 小时前
基于ESP32S3实现无人机RID模块底层源码编译
linux·开发语言·python
lzjava20249 小时前
Python的函数
开发语言·python
掌心向暖RPA自动化10 小时前
如何获取网页某个元素在屏幕可见部分的中心坐标影刀RPA懒加载坐标定位技巧
java·javascript·自动化·rpa·影刀rpa