Maven依赖冲突详解
前言
最近在项目的使用maven过程中,出现了maven依赖包冲突的问题。后续解决了。记下相关的知识点和资料。希望对你有作用。
一、maven依赖处理
1 对依赖的工作模式
当我们引入一个依赖时,maven会导入对应的包,并且该依赖所依赖的所有包都会进行导入,知道没有依赖为止。
2 包冲突
什么是冲突。它的意思就是在用一个项目导入不同版本的相同名的多个包,那么就产生的冲突。而这个冲突就很有可能导致项目无法运行。举个例子A->B->C1.0,D->E->C2.0,当你的项目引入A和D依赖的时候,就会出现C1.0和C2.0不同版本依赖包的冲突。
3 处理策略
我们在引入两个相同的包时,maven会有一套处理规则,也就是依赖规则,因为maven对于两个或以上相同的依赖,只会选取一个,避免两个依赖对项目产生不稳定性。下面对这个规则进行说明。
这里说的相同依赖,指的是相同包名但可以版本不同
最短路径优先
上面的A->B->C1.0,D->E->C2.0例子,maven会选取路径最短的作为引入。就是C2.0
第一级最后声明优先
第一级指的是我们pom.xml中声明的依赖。如果在这个文件声明两个相同名,但不同版本的依赖,maven会使用最后声明的那个依赖。
其他级别最先声明优先
非第一级,当路径长度一致的时候就会选取最先声明的那个包。
4 包冲突产生的问题
不同版本依赖发生冲突时,由于maven会选取某一个版本依赖,那么在项目中由于某一个包的使用就可能出现依赖包版本变化出现错误。
常见的冲突问题显示的异常:
- java.lang.NoSuchMethodError
- ava.lang.ClassNotFoundException
- java.lang.NoClassDefFoundError
但我们编译通过但确运行报这些异常就要考虑依赖冲突。
二、解决依赖冲突
1 排查冲突包
maven命令
我们可以在项目路径下使用maven命令查看依赖关系
mvn -U dependency:tree -Dverbose
完整的依赖关系图,且会告诉你哪个包产生了冲突
mvn -U dependency:tree
项目中实际的依赖关系图。
IDEA
在idea中提供可视化查看依赖的方式
2 解决方法
1.exclusion
去除依赖中的冲突依赖,使用exclusion,比如
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-a</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>group-c</groupId>
<artifactId>excluded-artifact</artifactId>
</exclusion>
</exclusions>
</dependency>
2.根据maven依赖规则解决
我们可以利用maven对依赖几个规则去解决冲突。比如出现了冲突,但冲突包的路径不是一级,根据最短路径,在pom文件重新声明一个包指定版本
<groupId>group-c</groupId>
<artifactId>artifact</artifactId>
<version>1.1.2</version>
3.依赖管理
使用父亲模块来管理子模块共同依赖的 jar 包版本,统一版本号
三、工具推荐
Idea插件maven helper
https://blog.youkuaiyun.com/GyaoG/article/details/120599475
参考或相关文章
- https://www.cnblogs.com/aspirant/p/8532962.html
- https://blog.youkuaiyun.com/UCLoveLikeTheWind/article/details/107986069
- https://blog.youkuaiyun.com/justry_deng/article/details/98665086