maven定义了许多dependency,每一个dependency内部也会定义它的dependency。web
1.0
),B <- C(1.1
)。1.1
)来导入(这个选择maven会根据不等路径短路径原则和同等路径第一声明原则选取),C(1.0
)中的类c在C(1.1
)中被修改而不存在了。1.0
)之前有可是升级到C(1.1
)就缺失的类c,致使运行期失败,出现很典型的依赖冲突时的NoClassDefFoundError
错误。NoSuchMethodError
错误。mvn dependency:tree
,或者使用IDEA的插件Dependency Analyzer插件来可视化地分析依赖关系。这个过程后能够明确哪些dependency引入了可能会冲突的依赖。1.1
版本,引入的B会在内部依赖C的1.0版本,那么Dependency Analyzer插件会出现依赖冲突提示,会提示B引入的C的1.0版本和当前选用的C的1.1
版本冲突于是被忽略(1.0 omitted for conflict with 1.1)。NoClassDefFoundError
或NoSuchMethodError
,致使编译期正常的代码没法在运行期跑起来。1.1
版本,好比B是一个许久未升级的旧项目,那么也能够考虑把A的版本拉低以使得C的版本降到与B一致的1.0
版本,固然这也可能会反过来致使A不能正常工做。1.1
版本中仍然没有改变的类或方法,那么能够考虑直接使用旧的1.0
版本,那么可使用exclusion
标签来在A中排除掉对C的依赖,那么A在使用到C的功能时会使用B引入的1.0
旧版本C。即A其实向B妥协使用了B依赖的C。来看个实例:spring
4.2.5.RELEASE
的spring-webmvc
,同时引入了3.2.1.RELEASE
的spring-security-web
。4.2.5.RELEASE
引入呢,其实前文提到过:好比对spring-beans
这个依赖来讲spring-webmvc:4.2.5.RELEASE
-spring-beans:4.2.5.RELEASE
的路径是2,而spring-security-web:3.2.1.RELEASE
-spring-security-core:3.2.1.RELEASE
-spring-beans:3.2.8.RELEASE
的路径是3,所以根据不等路径取短路径原则则选取了前者,即spring-beans:4.2.5.RELEASE
,注意的是引入时并非优先引入高版本的,同时若是依赖的路径长相等则取第一个出现的版本。spring-security-web
引入的一众spring依赖是3.X版本的,同spring-webmvc
的4.2.5.RELEASE
版本不一致。spring-webmvc
的4.2.5.RELEASE
的情形下寻找spring依赖版本一致的spring-security-web
,在www.mvnrepository.com寻找合适版本依赖的spring-security-web
,最终咱们看到了4.1.0.RELEASE
版本彷佛还不错,其依赖的spring版本在4.2.5.RELEASE
:spring-security-web
填入pom.xml看一下效果,确实已经没有依赖冲突产生了:4.2.5.RELEASE
的spring-security-web
怎么办,好比全部的spring-security-web
版本就是在4.2.3.RELEASE
或者4.2.6.RELEASE
,那么咱们就得想到妥协一下了:使用4.1.1.RELEASE
版本的spring-security-web
,它的spring依赖版本是4.3.1.RELEASE
,那么咱们试图使用exclusive
标签来忽略spring版本:express
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>4.1.1.RELEASE</version> <exclusions> <exclusion> <artifactId>spring-aop</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-beans</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-context</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-expression</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-web</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency>
依赖冲突会消失,spring-security-web
会使用4.2.5.RELEASE
版本的spring:mvc