不会校验。prerequisites 元素自 maven 3.0 起已废弃运行时校验,仅作文档用途;真正限制版本需使用 maven-enforcer-plugin 的 requiremavenversion 规则。

prerequisites 里指定的 Maven 版本真的会校验吗?
不会。Maven 官方早已废弃 prerequisites 的运行时校验功能,它现在只是个文档性标签——写进去不会报错,但构建时完全不生效。
常见错误现象:prerequisites 写了 maven >= 3.8.1,结果在 Maven 3.6.3 下照样能 build 成功,开发者误以为版本被保护了。
- 它只在生成项目站点(
mvn site)时可能出现在报告中,无任何拦截或警告 - 从 Maven 3.0 开始,该元素就不再参与构建生命周期控制
- 如果你真想拦住低版本用户,必须用其他机制替代
怎么真正限制 Maven 构建版本?
靠 maven-enforcer-plugin,这是目前最可靠、最广泛采用的方式。
使用场景:CI/CD 流水线卡点、团队统一开发环境约束、防止因插件行为差异导致本地与服务器构建不一致。
本文档主要讲述的是Maven 使用指南;Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- 在
pom.xml的<build><plugins></plugins></build>中添加该插件配置 - 用
requireMavenVersion规则指定最小版本(支持>=、>等表达式) - 建议同时启用
fail模式(默认),避免静默降级
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.4.1</version>
<executions>
<execution>
<id>enforce-maven</id>
<goals><goal>enforce</goal></goals>
<configuration>
<rules>
<requireMavenVersion>
<version>>=3.8.1</version>
</requireMavenVersion>
</rules>
</configuration>
</execution>
</executions>
</plugin>
为什么不用 distributionManagement 或 profiles 做版本控制?
它们和构建版本无关。distributionManagement 控制部署目标(如 Nexus 地址),profiles 控制条件激活,都不检查当前 Maven 运行时版本。
容易踩的坑:
- 把
prerequisites当成“安全锁”,结果上线后才发现某些插件在旧 Maven 上解析失败 - 误以为
properties里定义maven.version能影响运行时校验(不能,这只是普通变量) - 在 CI 脚本里用
mvn --version手动判断,但没覆盖所有执行路径(比如 IDE 直接调用 Maven Embedder)
兼容性与 CI 实际影响
maven-enforcer-plugin 自 3.0+ 起对 Maven 3.6.3+ 兼容良好,但在 Maven 3.2.x 及更早版本上可能无法加载(因 API 变更)。如果你还必须支持超老版本,只能靠外部脚本兜底。
性能影响几乎为零:该插件只在构建初期运行一次,不介入编译或打包流程。
- CI 配置中应确保插件版本与基础 Maven 版本匹配(例如 Maven 3.8+ 推荐用 enforcer 3.4.1)
- IDE(如 IntelliJ)通常会识别并提前报错,但 Eclipse 对 enforcer 支持较弱,需依赖命令行验证
- 注意:该检查发生在
validate阶段,所以即使clean compile也会触发,不是只在package时才起作用
prerequisites 可以删掉,或者留着当注释看;真正要卡版本,就老老实实配 maven-enforcer-plugin。别指望 XML 标签自己长腿去拦人。









