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

Maven依赖版本异常:Jar B版本为何在Jar C中变更?

关于Maven依赖版本不一致的成因分析

问题描述

我有版本1.2的Jar A,它依赖版本1.4.6的Jar B,单独在A的项目中执行mvn dependency:tree,仅显示Jar B的1.4.6版本。但在Jar C引入版本1.2的Jar A后,执行mvn dependency:tree却显示Jar B的版本为1.2.6,特此咨询该现象的成因。

依赖树信息

[INFO] A:jar:1.2
[INFO] \- B:jar:1.4.6:compile


[INFO] C:jar:1.0.9
[INFO] \- A:jar:1.2:compile
[INFO]   \- B:jar:1.2.6:compile

成因分析

这种现象是Maven的**依赖调解(Dependency Mediation)**机制导致的,核心遵循两个规则:

  • 路径最近者优先:依赖路径长度更短的版本会被优先选用
  • 声明顺序优先:如果路径长度相同,pom.xml中先声明的依赖版本会被选用

具体到你的场景:

  1. 单独构建Jar A时,A直接依赖B 1.4.6,依赖路径为A→B,长度为1,因此Maven选用1.4.6版本。
  2. 构建Jar C时,出现了B的多个版本来源:
    • 一种可能是Jar C自身或其其他直接依赖中,直接声明了B 1.2.6,依赖路径为C→B,长度为1,比A带来的C→A→B(长度2)路径更短,因此Maven优先选用1.2.6版本。
    • 另一种可能是Jar C的pom.xml中,某个依赖和A对B的依赖路径长度相同,但该依赖的声明顺序在A之前,Maven会选择先声明的版本。
  3. 除此之外,还要检查Jar C的pom.xml中是否通过<dependencyManagement>节点强制指定了B的1.2.6版本——dependencyManagement会统一管控所有依赖的版本,优先级高于依赖调解规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 20:21:03