如何在Maven中查找依赖的实际生效版本及定义模块?
在使用Maven时,依赖可能来自dependencyManagement(包括import的BOM)等渠道,存在多个版本冲突。当前avatica-core实际生效版本为3.19.6,但该依赖自身定义的版本是3.6.1,如何快速确认3.19.6这个生效版本定义在哪个模块?有没有Maven命令或工具可以查明该版本生效的原因?
已尝试过的命令:
mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:tree -Dverbose=true > maven2.json
解决方案
1. 精准过滤依赖树,聚焦目标依赖
用dependency:tree加上过滤参数,只输出avatica-core的依赖链路,避免冗余信息干扰:
mvn org.apache.maven.plugins:maven-dependency-plugin:3.6.1:tree -Dverbose=true -Dincludes=org.apache.calcite.avatica:avatica-core
输出里会列出该依赖的所有候选版本,以及最终生效版本的胜出原因——比如标注managed from ...说明版本来自dependencyManagement,或者omitted for conflict with 3.19.6显示版本冲突后的仲裁结果。
2. 生成生效POM,定位dependencyManagement来源
如果版本是由dependencyManagement(含导入的BOM)管控的,直接生成生效的全量POM文件:
mvn org.apache.maven.plugins:maven-help-plugin:3.4.0:effective-pom > effective-pom.xml
打开生成的effective-pom.xml,搜索avatica-core,就能找到管控该版本的dependencyManagement节点,同时能看到对应的父POM或导入BOM的来源。
3. 查看版本仲裁的完整细节
用dependency:resolve命令获取版本选择的完整决策过程:
mvn org.apache.maven.plugins:maven-dependency-plugin:3.6.1:resolve -Dverbose=true -Dincludes=org.apache.calcite.avatica:avatica-core
输出会明确标注每个版本的来源路径,以及Maven选择3.19.6的具体规则(比如依赖路径最短、dependencyManagement优先级更高等)。
内容的提问来源于stack exchange,提问作者ctc

