Maven 依赖包冲突问题解决
# 前言
今天在运行某个开源项目的时候遇到包冲突,报错:LoggerFactory is not a Logback LoggerContext but Logback is on the classpath
,部分原因就是包冲突导致的问题,所以正好整理下遇到 Maven 包冲突如何解决
# 方案
# 依赖冲突
实际上,我们很多时候都不知道究竟该在哪个引用中排除什么依赖,这个时候修改 pom 文件就显得无从下手。我们可以使用 IDEA 查看包的依赖情况图,直接在图中修改即可。
1、在 IDEA 中查看依赖情况。打开 pom 文件,在文件上右键-->maven-->show dependencies,如图。
2、依赖图一般都比较庞大,我们可以通过左上角的按钮调节图的的大小,也可以像调整网页大小一样,直接按住“Ctrl”再滑动鼠标滚轮就可以了
3、当出现包名冲突,表示依赖的那条线会变红,如下图所示
4、点击需要排除掉的包,会显示包的具体信息,然后鼠标右键-->Exclude,就可以排除了。你这个时候再去查看 pom 文件,发现它也会产生对应的变化。需要注意的是,你在点击包的时候整个依赖图的结构可能会产生一些变化,所以需要反复找到依赖包。这时,你可以“Ctrl+F”找到你需要的那个包,点击即可定位。
还有更方便的做法,就是安装 MAVEN Helper 插件
使用方法就是点击 pom 文件,点击左下角的 Dependency Analyzer
之后按照下图操作即可
依次进行上述操作,直到冲突依赖列表为空
# 最终解决
排除完冲突依赖,我们回到问题本身,LoggerFactory is not a Logback LoggerContext but Logback is on the classpath
部分情况下,没有冲突依赖仍旧报错,根据具体报错信息,可能是当前 classpath 上有不止一个日志框架的 jar,那么我们就需要从依赖图中手动找出该冲突日志依赖,手动 exclusion,示例如下
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
2
3
4
5
6
7
8
9
10
11
还有比较少见的就是可能 jdk 版本错误,我的就是降低 jdk 版本即可正常运行