怎麼解決maven管理jar包衝突問題
阿新 • • 發佈:2019-01-03
maven管理jar包依賴的時候,假如你的依賴包A需要間接依賴B的1.0版本,而你的工程裡又需要用到B的2.0版本,這個時候就可能會出現執行時jar衝突的異常,會報java.lang.NoSuchMethodError
或者 java.lang.ClassNotFoundException 、java.lang.NoClassDefFoundError
解決方法一:
第一步:查詢衝突jar包的依賴樹
mvn dependency:tree -Dverbose -Dincludes=org.springframework:spring
第二步:在pom裡找到相應的jar去掉他的依賴傳遞
<dependency>
<groupId>com.taobao</groupId>
<artifactId>memcache-session-super-util</artifactId>
<version>2.4.3-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
方法二:在父級pom中使用dependencyManagement管理公用的jar版本,子類中引入自己需要的jar版本,maven會優先使用子類的jar。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.taobao.sdk</groupId>
<artifactId>sdk</artifactId>
<version>20151027-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
不過這裡可能會有一個坑,假如你的project分了多個module,公共pom引入某個jar的1.0版本,你的web module中需要引入這個jar的2.0版本,但是你的web module又需要用到一個common module,而你沒有修改common 這個module的pom.xml,執行的時候如果某個方法間接的用到common module裡的方法而且又涉及到了這個jar的2.0新增方法,這個時候就會丟擲方法invoke失敗的異常。