⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 xxy开源 「xxy开源」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

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

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

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

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

<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,但不升级就是白装。

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

这是 Maven 4 最颠覆性的变化。

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

Maven 4 把 POM 一分为二:

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

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

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 新增显式声明:

<type>classpath-jar</type>
<type>module-jar</type>

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

<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 做了果断选择:

<subprojects>
<subproject>project-a</subproject>
<subproject>project-b</subproject>
</subprojects>

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

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

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

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

mvn -b concurrent verify

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

1. 条件表达式 Profile

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

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

2. 统一的 Sources 模型

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

<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 了。

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

mvnup check   # 生成报告
mvnup apply # 自动修改

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

文章目录
  1. 1. POM 模型升级到 4.1.0:不升也能用,但升了才有红利
  2. 2. Build POM / Consumer POM 分离:最重要的一刀
  3. 3. 新 Artifact Type:classpath 和 module path 终于能显式控制
  4. 4. Modules 改名 Subprojects:跟 Java 9 的”撞名”终于解决了
  5. 5. 树形生命周期:并行构建终于”名正言顺”
  6. 6. 两个”小变化”,实际影响不小
  7. 7. 官方升级工具:两行命令搞定迁移评估