本文涉及到以下几个概念须要注意:依赖冲突、依赖调解、依赖传递。html
原来运行得好好的代码,在引入一个 Jar 包后出现 NoSuchMethodException、NoClassDefFoundError 等错误提示,那么恭喜你,大几率遇到了依赖冲突
。apache
在认识依赖冲突以前,咱们先来了解一下 Maven 的依赖调解
。maven
参考 Maven依赖冲突问题原理简析 。ide
简单的说,若是一个项目中引入了同一个依赖(jar 包)的两个(或多个)不一样版本,Maven 会对这些依赖作调解,以确保最终(运行时)在项目中对于同一个依赖只引入一个版本。ui
依赖调解的两个原则:spa
如今咱们已经知道了,在一个项目中是可能引入同一个依赖(jar 包)的不一样版本的。 那么,在同一个 jar 包的不一样版本中可能存在一些差别,好比:.net
举个例子,咱们项目中引入了两个版本(1.0、2.0)的依赖 A,通过依赖调解后使用了较高的版本(2.0)。若是该依赖在升级的时候没有保持向下的兼容性,删掉了某些方法,而咱们项目中使用 1.0 版本的地方恰好调用了被删掉的这个方法,就会出现 NoSuchMethodException 异常。插件
不必定。若是通过依赖调解后最终使用的版本可以兼容全部的使用,程序就能够正常运行。命令行
根本缘由是经过直接或者间接依赖,在代码中引入了同一个依赖的不一样版本。code
在 IDE 中使用 Maven Enforcer Plugin
插件。 这个插件有不少规则,咱们最关心的是 Dependency Convergence
规则。 用法:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<configuration>
<rules><dependencyConvergence/></rules>
</configuration>
</plugin>
</plugins>
复制代码
参考官网介绍,该插件有两个执行目标:
执行方式:
mvn enforcer:enforce
执行结果:
Dependency convergence error for log4j:log4j:1.2.17 paths to dependency are:
+-com.ricston.conflict:conflict-info:2.1.3-SNAPSHOT
+-org.slf4j:slf4j-log4j12:1.7.6
+-log4j:log4j:1.2.17
and
+-com.ricston.conflict:conflict-info:2.1.3-SNAPSHOT
+-log4j:log4j:1.2.16
复制代码
根据这种方式发现依赖冲突后,咱们就可使用上面提到的两种方式(排除或者引入可用的直接依赖)来解决冲突。