
自 2010 年 Maven 3 发布 以来,Maven 对 Java 构建生态的整体支持方式,几乎没有发生过颠覆性的变化。
然而在这 15 年里,Java 世界早已天翻地覆:
相比之下,Maven 本身却显得有些“老态”。
Maven 4 的出现,正是为了解决这些长期积累的历史包袱。
虽然 Maven 4 仍未公布正式 GA 发布日期,但目前已经迭代到 第五个发布候选版本(RC5),从项目成熟度和变更稳定性来看,距离正式发布已相当接近。
“现在正是提前了解、评估和准备升级的合适时机。
Maven 4 将 POM 的模型版本升级为 4.1.0:
<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>也就是说:
“不升级 POM 也能用 Maven 4,但升级后才能真正“吃到红利”。
这是 Maven 4 最重要、也是最颠覆性 的变化之一。
在 Maven 3 中,发布到仓库的 POM 同时包含:
依赖使用者会被迫解析大量 “与我无关” 的信息。
Maven 4 的解决方法是 POM 扁平化(Flattening)。
Maven 4 正式区分:
类型 | 用途 |
|---|---|
Build POM | 项目自身构建 |
Consumer POM | 提供给依赖方 |
Consumer POM 具备以下特征:
开启方式:
mvn clean install -Dmaven.consumer.pom.flatten=true“Maven 3 时代需要额外的
Flatten Maven Plugin,Maven 4 中已成为 原生能力。
这一步,直接让依赖解析更快、更干净、更可预测。
在 Maven 3 中:
module-info.class → module path(自动推断)这种“隐式规则”在 Java 模块化时代并不够清晰。
Maven 4 新增类型:
<type>classpath-jar</type>
<type>module-jar</type>开发者终于可以 显式声明依赖放在哪里。
Maven 4 还新增了专门的注解处理器类型:
processorclasspath-processormodular-processor以 Lombok 为例:
<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,构建语义更清晰,也更利于工具链优化。
Java 9 引入模块系统后:
长期让新手和工具“集体懵逼”。
Maven 4 的选择是:
<subprojects>
<subproject>project-a</subproject>
<subproject>project-b</subproject>
</subprojects>同时还支持:
<parent /> 自动识别这是一次 语义层面 + 工程实践层面 的双重升级。
Maven 3 的生命周期是 线性的,即使多模块,也很难高效并行。
Maven 4 引入 Tree-based Lifecycle:
开启方式:
mvn -b concurrent verify<condition>
exists('${project.basedir}/src/**/*.xsd')
&& length(${user.name}) > 5
</condition> 不再只是 os.name、jdk 这种基础判断,而是 真正的表达式系统。
Maven 3:
<sourceDirectory>...</sourceDirectory>
<testSourceDirectory>...</testSourceDirectory>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>更适合:
Maven 4 还提供了官方升级工具:
mvnup check # 只生成报告
mvnup apply # 自动修改它会分析:
并给出 可执行的升级建议。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。