解決Maven依賴衝突

因爲Maven使用依賴傳遞的方式,當你引入一個依賴的時候,如果該依賴(dependency)本身也引用了其他依賴,我們的應用就自動引用了依賴的依賴,這樣不可避免的會造成依賴衝突!

在將應用打包之前,我們應該先檢查我們的依賴列表,檢查步驟如下:

1、執行maven命令:mvn dependency:tree,顯示我們的maven樹,這裏會打印所有的依賴,包含依賴的依賴

2、確認所有的依賴是否都是我需要的?

3、檢查同一個依賴是否存在多個版本?如果有多個版本,說明是衝突了的。補充另一種情況也算衝突:比如oracle的jdbc包,ojdbc6-11.2.0.3.jar和ojdbc14-10.2.0.3.0.jar,它們的artifactId雖然不同,但都是oracle的jdbc包。


如果某個依賴並不是我們想要的,且它是由引入的依賴引入的(即:依賴的依賴),可以採取以下方式剔除:

1、使用exclusions

<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.17</version>
	<exclusions>
		<exclusion>
			<artifactId>jmxri</artifactId>
			<groupId>com.sun.jmx</groupId>
		</exclusion>
		<exclusion>
			<artifactId>jmxtools</artifactId>
			<groupId>com.sun.jdmk</groupId>
		</exclusion>
	</exclusions>
</dependency>
這段配置說明:引入log4j,log4j本身又依賴了jmxri、jmxtools,這兩個並不需要

2、使用<optional>true</optional>
Project A的pom文件有如下配置:
<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.17</version>
	<optional>true</optional>
</dependency>
Project B依賴了Project A
這段配置說明:Project A依賴了log4j,Project B不會自動引入log4j。凡是在Project A中依賴的屬性:optional爲true的,Project B都不會自動引入這些依賴,除非在Project B中明確引入。

exclusions和optional的說明參照:
https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html

3、最近發現一個特別無語的現象,執行maven命令:mvn dependency:tree,打印的依賴樹是沒有某個依賴的,但是打出來的war包,WEB-INF/lib下面就是有這個依賴,只得將lib下的jar包全部解壓,找出所有的pom文件,最終發現在某個jar包的pom文件引入了這個依賴,對這個jar依賴配置exclusions,剔除我不要的那個依賴,問題得以解決
附上步驟:
Project A的pom.xml,明確引入了ojdbc6.11.2.0.3.jar,但是WEB-INF/lib莫名多了個ojdbc14-10.2.0.3.0.jar,依賴樹是沒有打印這個的
a、war包抽出WEB-INF/lib,將lib打成壓縮成zip包:lib.zip
b、將lib.zip傳到一臺linux機器上的目錄:/tmp
c、解壓:
cd /tmp
unzip lib.zip
cd lib
find ./ -type f -name "*jar" -exec jar -xvf {} \;
find ./ -type f -name "*jar" -exec rm -rf {} \; 
find ./ -type f -name "pom.xml"|xargs grep "ojdbc14"

最後一個命令打印:

./META-INF/maven/com.pay.module/pay-module/pom.xml:                        <artifactId>ojdbc14</artifactId>

溫馨提示:用完刪掉lib.zip和lib目錄

d、原來是pay-module這個依賴引入了ojdbc14,所以在Project A的pom.xml中,pay-module依賴下配置exclusions,剔除ojdbc14

<dependency>
	<groupId>com.pay.module</groupId>
	<artifactId>pay-module</artifactId>
	<version>1.2.17</version>
	<exclusions>
		<exclusion>
			<artifactId>ojdbc14</artifactId>
			<groupId>com.oracle</groupId>
		</exclusion>
	</exclusions>
</dependency>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章