maven导入jar包时冲突的解决
什么是依賴(lài)傳遞
先添加 springmvc 的核心依賴(lài)的坐標(biāo)
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.2.4.RELEASE</version></dependency> </dependencies>會(huì)發(fā)現(xiàn)出現(xiàn)除了 spring-webmvc 以外的其他 jar。因?yàn)槲覀兊捻?xiàng)目依賴(lài) spring-webmv.jar,而 spring-webmv.jar 會(huì)依賴(lài) spring-beans.jar 等等,所以 spring-beans.jar 這些 jar 包也出現(xiàn)在了我 們的 maven 工程中,這種現(xiàn)象我們稱(chēng)為依賴(lài)傳遞。從下圖中可看到他們的關(guān)系:(請(qǐng)注意 spring-beans 的版本)
依賴(lài)沖突的解決
接著添加一個(gè)依賴(lài)
我們會(huì)發(fā)現(xiàn)這兩個(gè) jar 包同時(shí)都依賴(lài)了 spring-beans
但是spring-webmvc 依賴(lài) spirng-beans-4.2.4,spring-context 依賴(lài) spring-beans-5.0.2,但是發(fā)現(xiàn) spirng-beans-4.2.4 ? 加入到工程中
而我們希望 ?spring-beans-5.0.2 ? ?加入工程。這就造成了依賴(lài)沖突。解決依賴(lài)沖突有以下原則:
依賴(lài)調(diào)解原則
maven自動(dòng)按照下邊的原則調(diào)解:
1、第一聲明者優(yōu)先原則
在pom文件定義依賴(lài),先聲明的依賴(lài)為準(zhǔn)。
測(cè)試:
如果將上邊spring-webmvc和spring-context順序顛倒,系統(tǒng)將導(dǎo)入spring-beans-5.0.2。
分析:
由于spring-webmvc在前邊以spring-webmvc依賴(lài)的spring-beans-5.0.2為準(zhǔn),所以最終spring-beans-5.0.2添加到了工程中。
2、路徑近者優(yōu)先原則
例如:還是上述情況,spring-contex和spring-webmvc都會(huì)傳遞過(guò)來(lái) spirng-beans,那如果直接把spring-beans的依賴(lài)直接寫(xiě)到pom文件中,那么項(xiàng)目就不會(huì)再使用其他依賴(lài)傳遞來(lái)的spring-beans,因?yàn)樽约褐苯釉趐om中定義spring-beans要比其他依賴(lài)傳遞過(guò)來(lái)的路徑要近。
在本工程中的pom中加入spirng-beans-5.0.2的依賴(lài),根據(jù)路徑近者優(yōu)先原則,系統(tǒng)將導(dǎo)入spirng-beans-5.0.2:
排除依賴(lài)
上邊的問(wèn)題也可以通過(guò)排除依賴(lài)方法輔助依賴(lài)調(diào)解,如下:
比如在依賴(lài)spring-webmvc的設(shè)置中添加排除依賴(lài),排除spring-beans,
下邊的配置表示:依賴(lài)spring-webmvc,但排除spring-webmvc所依賴(lài)的spring-beans。
? maven工程要導(dǎo)入jar包的坐標(biāo),就必須要考慮解決jar包沖突。
? ? ? 解決jar包沖突的方式一:
? ? ? 第一聲明優(yōu)先原則:哪個(gè)jar包的坐標(biāo)在靠上的位置,這個(gè)jar包就是先聲明的。
? ? ? 先聲明的jar包坐標(biāo)下的依賴(lài)包,可以?xún)?yōu)先進(jìn)入項(xiàng)目中。
? ? ? maven導(dǎo)入jar包中的一些概念:
? ? ? 直接依賴(lài):項(xiàng)目中直接導(dǎo)入的jar包,就是該項(xiàng)目的直接依賴(lài)包。
? ? ? 傳遞依賴(lài):項(xiàng)目中沒(méi)有直接導(dǎo)入的jar包,可以通過(guò)項(xiàng)目直接依賴(lài)jar包傳遞到項(xiàng)目中去。
? ? ? 解決jar包沖突的方式二:
? ? ? 路徑近者優(yōu)先原則。直接依賴(lài)路徑比傳遞依賴(lài)路徑近,那么最終項(xiàng)目進(jìn)入的jar包會(huì)是路徑近的直接依賴(lài)包。
? ? ? 解決jar包沖突的方式三【推薦使用】:
? ? ? 直接排除法。
? ? ? 當(dāng)我們要排除某個(gè)jar包下依賴(lài)包,在配置exclusions標(biāo)簽的時(shí)候,內(nèi)部可以不寫(xiě)版本號(hào)。
? ? ? 因?yàn)榇藭r(shí)依賴(lài)包使用的版本和默認(rèn)和本jar包一樣。
?
總結(jié)
以上是生活随笔為你收集整理的maven导入jar包时冲突的解决的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: maven的java工程取mysql数据
- 下一篇: pom文件内标签的讲解