我在java项目中使用maven管理依赖。其中借助依赖工具查看,commons-codec的版本是1.16.0。
最终构建出来的jar包中也是1.16.0版本。
但是我通过idea自带的依赖分析工具查看,commons-codec有两个来源,根据颜色,1.16.0版本应该是是在poi中指定的
但是poi-4.1.2中指定的却是1.13版本
我又查看了httpclient中的配置,是1.9版本的commons-codec。这里是因为httpclient是继承自httpcomponents-client,httpcomponents-client中配置了1.9
所以我想知道为什么最终是1.16版本的commons-codec
Maven依赖决策
只有两个原则:
pom
中先声明的优先比如你问题中的
commons-codec
(大概举例,没太看清楚)路径1:
kc-common
-->aliyun-sdk-oss
-->http-client
-->commons-codec
路径2:
kc-common
-->poi-ooxml
-->poi
-->commons-codec
你这两个路径长短一样,就会看
aliyun-sdk-oss
和poi-ooxml
在kc-common
中的声明顺序,目前大概率是aliyun-sdk-oss
在前version
问题httpcomponents-client
中配置了1.9
poi-4.1.2
中指定的是1.13
版本最终是
1.16.0
1.看你的
pom
是不是有<parent>
标签,比如声明了spring-boot-parent
,这里面会声明version
,会将整个项目中依赖的version
全部统一为声明的版本2.如果有
<parent>
标签,并且声明的version
不是1.16.0
,那你看自己的pom
中是不是写了<properties>
定义,覆盖了<parent>
中的version
,会以你定义的为准3.查看当前
pom
是不是声明了<dependencyManagement>
统一管理了version
4.是否使用了三方的
bom
来管理了版本,三方bom
依赖会定义一系列version
来统一版本5.如果有多个
bom
对同一个库进行了版本管理,先声明的版本会统一整个项目的版本确定
version
1.你可以在idea安装
Maven Helpher
插件,通过Dependency Analyzer
标签的All Dependencies as Tree
来查看红色的依赖2.在项目启动类main里写某个Jar里面具体的一个类,
import
进去,点击到源码,点击Project
栏,点击Select Opened File
就可以确定运行时具体决策的jar是哪个版本