maven解決包沖突方法詳解
Maven根據(jù)最近勝利策略(nearest wins strategy)的原則工作,同時(shí)解決依賴沖突,這意味著它在依賴樹中找到更接近的版本,它將采用該版本并忽略其他版本。實(shí)際上Maven有點(diǎn)懶,所以每當(dāng)它開始尋找依賴時(shí),它就會從根目錄開始遍歷樹,無論它先前找到哪個(gè)版本,它都會選擇它并從它們返回而不進(jìn)一步。如果它進(jìn)一步尋找依賴版本,可能會有機(jī)找到一些更新的版本,但它從第一個(gè)發(fā)現(xiàn)的版本那里返回,并采用舊版本并用它來解決依賴關(guān)系。
可以用下面的命令顯示依賴樹:
mvn dependency:tree
老實(shí)說,這不是maven的錯(cuò),因?yàn)樗氡M快完成這項(xiàng)工作。最重要的是,maven 不知道你的應(yīng)用程序期望哪個(gè)版本,所以Maven會告訴你,嘿,你有責(zé)任讓我知道你想要哪個(gè)版本,如果你不告訴我,我會以自己的方式工作,即更近更好。
請下載本文的github源代碼:
https://github.com/yujiaao/maven-dependency-conflict-demo
我們有一個(gè) web 應(yīng)用 resolve-web,該工程依賴于 project-A 和project-B,project-A 依賴于 project-common 的 1.0 版本并調(diào)用其中的 sayHello() 方法。project-B 依賴于project-C,而project-C又進(jìn)一步依賴于project-common的2.0 版本并調(diào)用其中的 sayGoodBye() 方法。project-common 的 1.0 和 2.0 版本是不同的,1.0 中之包含sayHello() 方法,而2.0 中包含了sayHello()和sayGoodBye()兩個(gè)方法。整個(gè)項(xiàng)目的依賴關(guān)系如下圖:
根據(jù)Maven的transitive依賴機(jī)制,resolve-web 將同時(shí)依賴于project-common 的 1.0 和 2.0 版本,這就造成了依賴沖突。而根據(jù)最近獲勝策略,Maven 將選擇 project-common 的 1.0 版本作為最終的依賴。
這和 Gradle 不同,Gradle 在默認(rèn)情況下將選擇最新的版本作為獲勝版本。
而對于Maven,由于proejct-common的1.0版本比2.0版本在依賴樹中離resolve-web更近,故 1.0 版本獲勝。在 resolve-web 中執(zhí)行mvn dependency:tree -Dverbose 可以看到 resolve-web 的依賴關(guān)系:
[INFO] resolve-web:resolve-web:war:1.0-SNAPSHOT [INFO] +- junit:junit:jar:3.8.1:test [INFO] +- project-B:project-B:jar:1.0:compile [INFO] | \- project-C:project-C:jar:1.0:compile [INFO] | \- (project-common:project-commmon:jar:2.0:compile - omitted for conflict with 1.0) [INFO] +- project-A:project-A:jar:1.0:compile [INFO] | \- project-common:project-commmon:jar:1.0:compile [INFO] \- javax.servlet:servlet-api:jar:2.4:provided
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring boot項(xiàng)目中異常攔截設(shè)計(jì)和處理詳解
這篇文章主要介給大家紹了關(guān)于Spring boot項(xiàng)目中異常攔截設(shè)計(jì)和處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧2018-12-12Spring遠(yuǎn)程加載配置的實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Spring遠(yuǎn)程加載配置的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03基于SpringBoot+Redis實(shí)現(xiàn)一個(gè)簡單的限流器
在Spring?Boot中使用Redis和過濾器實(shí)現(xiàn)請求限流,過濾器將在每個(gè)請求到達(dá)時(shí)檢查請求頻率,并根據(jù)設(shè)定的閾值進(jìn)行限制,這樣可以保護(hù)您的應(yīng)用程序免受惡意請求或高并發(fā)請求的影響,本文我們通過Spring?Boot?+Redis?實(shí)現(xiàn)一個(gè)輕量級的消息隊(duì)列,需要的朋友可以參考下2023-08-08HTTP 415錯(cuò)誤-Unsupported media type詳解
這篇文章主要介紹了HTTP 415錯(cuò)誤-Unsupported media type詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Springboot整合Spring Cloud Kubernetes讀取ConfigMap支持自動刷新配置的教程
這篇文章主要介紹了Springboot整合Spring Cloud Kubernetes讀取ConfigMap支持自動刷新配置,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09SpringCloud+RocketMQ實(shí)現(xiàn)分布式事務(wù)的實(shí)踐
分布式事務(wù)已經(jīng)成為了我們的經(jīng)常使用的。所以我們來一步一步的實(shí)現(xiàn)基于RocketMQ的分布式事務(wù)。感興趣的可以了解一下2021-10-10微信公眾帳號開發(fā)-自定義菜單的創(chuàng)建及菜單事件響應(yīng)的實(shí)例
本篇文章主要介紹了微信公眾帳號開發(fā)-自定義菜單的創(chuàng)建及菜單事件響應(yīng)的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-12