maven 项目中显式声明了 json-smart 2.4.10,但 dependency:tree 却显示 2.3,根本原因是某间接依赖强制引入了低版本,导致版本冲突时 maven 采用“最近胜利”原则选择了 2.3。本文详解定位与排除方案。
maven 项目中显式声明了 json-smart 2.4.10,但 dependency:tree 却显示 2.3,根本原因是某间接依赖强制引入了低版本,导致版本冲突时 maven 采用“最近胜利”原则选择了 2.3。本文详解定位与排除方案。
在 Maven 的依赖解析机制中,当多个路径引入同一坐标(groupId:artifactId)但不同版本的依赖时,Maven 会依据依赖调解(Dependency Mediation)规则——主要是“第一声明优先”和“路径最近优先”——选择最终生效的版本。即使你在当前模块的 pom.xml 中明确声明了
✅ 正确排查步骤如下:
-
临时移除显式声明:注释或删除你模块中的 json-smart:2.4.10 依赖,再执行
mvn dependency:tree -Dincludes=net.minidev:json-smart
此时输出将清晰暴露是哪个上游依赖(如 org.springframework.boot:spring-boot-starter-json 或 com.fasterxml.jackson.datatype:jackson-datatype-jsr310 等)带入了 2.3。
-
定位并排除冲突传递依赖:假设发现是 com.example:legacy-sdk:1.5.0 引入了 json-smart:2.3,则在该依赖声明中添加
: <dependency><groupid>com.example</groupid><artifactid>legacy-sdk</artifactid><version>1.5.0</version><exclusions><exclusion><groupid>net.minidev</groupid><artifactid>json-smart</artifactid></exclusion></exclusions></dependency>
-
显式声明所需版本(推荐置于 dependencyManagement):为统一管理,建议在根 POM 的
中锁定版本: <dependencymanagement><dependencies><dependency><groupid>net.minidev</groupid><artifactid>json-smart</artifactid><version>2.4.10</version></dependency></dependencies></dependencymanagement>
这样所有子模块即使不声明 version,也会继承该版本,避免重复排除。
⚠️ 注意事项:
- 不要仅靠
provided 或true 解决版本覆盖问题,它们不改变依赖调解逻辑; - mvn dependency:tree -Dverbose 可显示冲突详情(如 “omitted for conflict with 2.4.10”),但需结合 -Dincludes 精准过滤;
- json-smart 2.4.x 与 2.3.x 存在 API 兼容性风险(如 JSONParser 构造函数变更),强制降级可能导致 NoSuchMethodError,务必验证运行时行为。
总结:Maven 的版本选择不是“谁写在后面谁生效”,而是由依赖图结构决定。解决此类问题的关键在于主动暴露隐式传递链 → 精准排除干扰项 → 通过 dependencyManagement 全局管控,而非反复刷新或清理本地仓库。











