在项目中,如果我们同时A依赖和B,A和B依赖中又同时依赖C,但是依赖的C依赖的版本不同,这会导致依赖冲突,最后编译打包后会有一个Cjar包
问题:这时候,如果 B依赖用的是 C 依赖中旧版本的方法,但是 Maven 最终选择了 A 依赖的新版本的 C 依赖,就会导致B依赖找不到方法。抛出ClassNotFoundException
maven选择依赖原则
最短路径优先原则
假如你用了AB两个依赖,这两个依赖都依赖C
A依赖X,X依赖Y,Y依赖C
B依赖C
那么Maven会直接选择A依赖的那个C
最先声明原则
如果 A 和 B 依赖 C,两者依赖长度一样,那么 Maven 会优先选先声明的那一个。
A依赖C
B依赖C
解决方案
排除依赖
<exclusion>
XML
<dependency>
<groupId>com.example</groupId>
<artifactId>A</artifactId> <!-- 依赖了 C:1.0 -->
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>B</artifactId>
<exclusions>
<exclusion>
<groupId>com.example</groupId>
<artifactId>C</artifactId>
</exclusion>
</exclusions>
</dependency>
此时B最终会依赖A依赖的C
版本锁定
在一个项目中,可能会有多个依赖依赖不同版本的C,一个个排除是不现实的
在父级pom的版本号管理中锁定C的版本号
XML
<dependencyManagement>
<dependency>
<groupId>com.example</groupId>
<artifactId>C</artifactId>
<version>3.0</version>
</dependency>
</dependencyManagement>