Maven 3.9.16 是一个典型的维护版本,没有新特性,但修了两个在实际项目中会踩到的坑:多线程构建时的参数解析问题和插件解析的向后移植修复。如果你在用 3.9.x 系列且遇到过并行构建行为异常或插件版本找不到的情况,这个版本值得更新。
threadConfiguration 不再"吃掉"空格
第一个修复针对的是 --threads(-T)参数的解析逻辑。
Maven 支持并行构建,常用方式是 -T 1C(每个 CPU 核一个线程)或 -T 4(固定 4 纗程)。问题出在当参数值前后带有空格时,旧版本的 threadConfiguration 解析器会直接报错或忽略配置,导致并行构建静默退化为单线程执行——你可能以为构建加速了,实际上根本没并行。
3.9.16 调整了解析逻辑,允许参数值被空格包围,比如在 CI 脚本中这样写不再出问题:
# 以前可能失败的写法(参数值前后有空格)
mvn clean install -T " 1C "
# 3.9.16 中可以正常解析
mvn clean install -T 1C
# 更常见的场景:CI 环境变量拼接时引入空格
THREADS="1C"
mvn clean install -T "$THREADS"
这个 bug 最隐蔽的地方在于:它不会让构建失败,只是让并行配置失效。如果你的 CI 从 8 分钟没变过,检查一下是不是 -T 参数根本没生效。
插件解析修复从 3.10.x 向后移植
第二个修复更关键——Maven 3.10.x 中发现并修复了一个插件解析问题,现在被移植到了 3.9.16。
具体场景:当项目 POM 中声明了插件但没有指定版本,Maven 需要通过插件仓库和默认版本映射来解析。在某些仓库配置组合下(特别是涉及镜像和仓库策略时),解析逻辑会跳过正确的版本,导致构建时使用了错误的插件版本或直接报错找不到插件。
这个问题在多模块项目中最容易触发,因为插件解析会受父 POM 和子模块仓库配置叠加的影响。
升级与验证
升级 Maven 本身很简单,但关键是验证升级后构建行为确实发生了变化。
安装或升级
# 下载(以 Linux 为例)
curl -O https://archive.apache.org/dist/maven/maven-3/3.9.16/binaries/apache-maven-3.9.16-bin.tar.gz
# 解压到指定目录
tar -xzf apache-maven-3.9.16-bin.tar.gz -C /opt/
# 设置环境变量
export MAVEN_HOME=/opt/apache-maven-3.9.16
export PATH=$MAVEN_HOME/bin:$PATH
# 确认版本
mvn --version
# 应输出:Apache Maven 3.9.16
验证并行构建确实生效
升级后,用以下方式确认 -T 参数被正确识别:
# 先用单线程构建计时
time mvn clean install
# 再用并行构建计时
time mvn clean install -T 1C
# 对比两次耗时。如果差距明显(比如 8 分钟 vs 3 分钟),说明并行生效。
# 如果耗时几乎一样,检查是否有模块间依赖导致并行度受限。
验证插件解析
在多模块项目中,故意留一个插件不指定版本,确认解析正常:
<!-- pom.xml 中只声明插件,不写版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!-- 不指定 version,让 Maven 自动解析 -->
</plugin>
# 查看实际解析到的版本
mvn help:effective-pom -pl . | grep -A5 'maven-compiler-plugin'
# 或直接查看插件描述
mvn plugin:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin
如果解析失败,旧版本会报类似 PluginResolutionException 的错误;3.9.16 应该能正确回退到默认版本映射。
升级前的注意事项
- 3.9.x 到 3.9.16 是安全升级:没有破坏性变更,POM 和插件配置不需要改动。
- 如果你还在用 3.8.x:3.9.x 系列有更大的变更(如依赖调解策略调整),升级前读一下 Maven 3.9.0 release notes。
- CI 脚本检查:如果 CI 中 Maven 版本是硬编码的 Docker 镜像标签,更新镜像版本比改环境变量更可靠。比如从
maven:3.9.8改为maven:3.9.16。
# GitHub Actions 示例:更新 Maven 版本
jobs:
build:
runs-on: ubuntu-latest
container:
image: maven:3.9.16-eclipse-temurin-17
steps:
- uses: actions/checkout@v4
- run: mvn clean install -T 1C
这个版本不需要你改任何 POM,但如果你之前被这两个 bug 卡过,升级就是一行版本号的改动。