目录
1、什么是maven的依赖冲突
- maven依赖调节机制选择错了版本(路径长度不同[就近原则],路径长度相同[先声明原则])
某某某class not found
某某某方法() not found
MyClass.doMethod() not found。。。。
- 这个就是典型的工作场景里面的依赖冲突问题
- 传递性依赖 + 依赖调解,导致了这个问题
2、依赖冲突是如何产生的?
- 比如X依赖了A和B,此时A依赖了C-1.0,B依赖了D,D依赖了C-2.0
X -> A -> C-1.0
X -> B -> D -> C-2.0
- 此时就会导致的事情是,由于A -> C1.0是最短路径,所以会用C1.0
- 但是坑爹的事情发生了,B依赖的是D,D依赖的C结果用了C-1.0版本
- D本来用的是C-2.0的一个方法,但是现在给D的是C-1.0的一个类
- 比如C-1.0的类CClass.sayHello()
- C-2.0给类CClass加了一些方法,比如CClass.printHello(),同时也有CClass.sayHello()方法
- D调用了C-2.0里面的printHello()这个方法
- 如果用的时C-1.0,把C-1.0的CClass提供给D去用,D去调用printHello()方法的时候,就会报错。。。
- C这个项目的CClass这个类的printHello()这个方法没有找到,not found的异常
3、如何解决这样的依赖冲突?
- 一般来说,用最新的版本
- 因为新版本一般可以兼容旧版本,但是旧版本一定不会提供新版本的功能。
- 你不要让maven自动去选择C-1.0来使用,而是手动强制使用C-2.0.
4、mvn depedency:tree这个命令
- mvn dependency:tree,用dependency插件的tree goal,执行,进行依赖链条分析
- 比如你发现C这个项目下报出了类似的问题,然后就用mvn dependency:tree这个命令看一下整个项目的依赖路径树
- 看看所有的依赖路径里,有哪几个版本的C项目,看一下,自己看看要用哪个版本的C,然后将其他的C版本的依赖全部手动排除掉
此时要做的事情就是。。。
在A下面
<dependency>
<groupId>A</groupId>
<artifactId>A</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>C</groupId>
<artifactId>C</artifactId>
</exclusion>
</exclusions>
</dependency>
这样的话,就只剩下了一个C-2.0,那肯定是用C-2.0楼,无论是A还是D,都是用C-2.0了