[TOC]maven
咱们知道maven有传递性依赖机制,举例来讲,当咱们须要A的依赖的时候,就会在pom.xml中引入A的jar包;而A的jar包中依赖了B的jar包,这样Maven在解析pom.xml的时候,会依次将A、B 的jar包所有都引入进来。google
这样就会形成一个问题:spa
若是C的methodC使用了新版本G21才拥有的新类/新方法,程序中调用了C对应G21的新类/新方法时,由于项目中引用的是G20,因此JVM去加载Class时就会发现G20没有这个类,就会抛出ClassNotFoundException;一样,调用G20没有的新方法时会抛出NoSuchMethodError。插件
通常来讲,使用IDEA插件是一个简便的排查方法code
经过Maven命名行的方式也是也不错的选择:xml
例如:blog
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <exclusions> <exclusion> <artifactId>error_prone_annotations</artifactId> <groupId>com.google.errorprone</groupId> </exclusion> </exclusions> </dependency>
在引用guava时将com.google.errorprone这个包排除掉。ci
固然也有一些其余方法,对我来讲第一种已经知足平常使用了。io
最重要的仍是要主动避免jar包冲突的状况,在父pom文件中利用 <dependencyManagement>,对依赖Jar包进行统一版本管理,一劳永逸。一般的作法是,在parent模块的pom文件中尽量地声明全部相关依赖Jar包的版本,并在子pom中简单引用该构件便可。class
例如在父pom文件中定义lombok的版本:
<dependencyManagement> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> </dependencies> </dependencyManagement>
而后在子moudle中:
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
子moudle中自动会引用版本为1.18.10的lombok Jar包