YON Blog

Maven 依赖解析规则

随便记录点东西,博客老开天窗也不好。

前两天项目运行时报找不到类的错误,很明显是包冲突了,用 mvn dependency:tree -Dverbose 看了下,发现依赖的一个库有两个版本,maven 使用了旧版本,我之前印象中(可能是受 pip 影响)maven 是会默认使用最新版本的,看来是错了。于是搜索了下,发现 maven 解决依赖冲突的时候是使用的最短路径原则 [1]。

所谓路径就是用 mvn dependency:tree 命令输出依赖树的时候,一个包到根节点的距离。最短路径就是说距离根节点近的包版本优先级更高,所以我们在项目的主 pom 里设置的版本优先级是最高的。如果一个包有多个版本,而且它的多个版本的路径一样,那么第一个出现的版本胜出。这里顺便说下,如果你在同一个 pom 里一个包定义了多次,那么后面的定义会覆盖前面的定义,这里不是前面说的同路径的情况。

[1] Introduction to the Dependency Mechanism