jar包冲突

Jar包冲突的原因

我们知道maven有传递性依赖机制,举例来说,当我们需要A的依赖的时候,就会在pom.xml中引入A的jar包;而A的jar包中依赖了B的jar包,这样Maven在解析pom.xml的时候,会依次将A、B 的jar包全部都引入进来。

这样就会造成一个问题:

  • A->B->C->G21(guava 21.0)

  • E->F->G20(guava 20.0)

    假设pom.xml 文件中引入A与E两个依赖,按照上述的传递性依赖机制,与默认的依赖调解机制(第一:路径最近者优先;第二:第一声明优先),默认引用的是G20版本的jar包,G21的jar包不会被引用。

如果C的methodC使用了新版本G21才拥有的新类/新方法,程序中调用了C对应G21的新类/新方法时,因为项目中引用的是G20,所以JVM去加载Class时就会发现G20没有这个类,就会抛出ClassNotFoundException;同样,调用G20没有的新方法时会抛出NoSuchMethodError。

Jar包冲突排查

使用 maven helper 插件

  1. 下载maven helper插件
    在这里插入图片描述

  2. 打开要排查的 pom.xml

  3. 点击文件下方的 Dependency Analyzer
    在这里插入图片描述

  4. 以图中的log4j为例,红色的是未使用到的,白色的是当前使用的版本
    在这里插入图片描述

  5. 选中不需要的依赖,右键 -> Exclude