咱們知道maven有傳遞性依賴機制,舉例來講,當咱們須要A的依賴的時候,就會在pom.xml中引入A的jar包;而A的jar包中依賴了B的jar包,這樣Maven在解析pom.xml的時候,會依次將A、B 的jar包所有都引入進來。maven
這樣就會形成一個問題:google
若是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
固然也有一些其餘方法,對我來講第一種已經知足平常使用了。it
最重要的仍是要主動避免jar包衝突的狀況,在父pom文件中利用
例如在父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包