You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maven重复直接依赖版本选择异常及依赖传递冲突问题咨询

为什么Maven在重复直接依赖时选择了后声明的JUnit 4.10版本?

这确实是个容易让人混淆的点——你遇到的现象其实是Maven处理直接重复依赖的规则和传递依赖冲突的规则不一样导致的,我来给你理清楚:

首先得明确Maven处理两类依赖冲突的不同逻辑:

  • 传递依赖冲突:遵循「路径最近优先」,如果路径长度相同,才会采用「pom中先声明的依赖版本优先」的规则,这也是你提到的常规依赖调解原则。
  • 直接重复依赖:当你在pom.xml里直接声明了同一个groupId:artifactId的多个依赖时,Maven的规则是最后一个声明的版本会覆盖前面所有的,和传递依赖的顺序逻辑刚好相反!

回到你的例子:
你在<dependencies>里先写了JUnit 4.11,之后又写了JUnit 4.10,对于这种直接重复的依赖,Maven会直接选择最后声明的4.10版本。而这个版本自带的传递依赖org.hamcrest:hamcrest-core:1.1自然也会被引入,完全符合这个逻辑。

如果想验证的话,你可以把两个依赖的顺序调换一下——先写4.10,再写4.11,Maven就会选择4.11版本,对应的hamcrest-core也会变成1.3版本,亲测有效~

补充一句:这个行为在Maven 3.x全版本都是一致的,你用的3.6.3当然也遵循这个规则,并不是依赖调解原则失效,而是你混淆了直接依赖和传递依赖的处理逻辑啦。

内容的提问来源于stack exchange,提问作者Number945

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:52:40