我们知道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。
下载maven helper插件
打开要排查的 pom.xml
点击文件下方的 Dependency Analyzer
以图中的log4j为例,红色的是未使用到的,白色的是当前使用的版本
选中不需要的依赖,右键 -> Exclude