日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Maven提高篇系列之(五)——处理依赖冲突

發(fā)布時(shí)間:2025/5/22 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Maven提高篇系列之(五)——处理依赖冲突 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

這是一個(gè)Maven提高篇的系列,包含有以下文章:

?

  • Maven提高篇系列之(一)——多模塊 vs 繼承
  • Maven提高篇系列之(二)——配置Plugin到某個(gè)Phase(以Selenium集成測試為例)
  • Maven提高篇系列之(三)——使用自己的Repository(Nexus)
  • Maven提高篇系列之(四)——使用Profile
  • Maven提高篇系列之(五)——處理依賴沖突
  • Maven提高篇系列之(六)——編寫自己的Plugin(本系列完)
  • ?

    ??

    在本系列的上一篇文章中,我們講到了如何使用Profile,在本文中,我們將講到如何處理Maven的依賴沖突。

    ?

    不知道你在使用Maven時(shí)是否遇到過諸如"NoSuchMethodError"或"ClassNotFoundException"之類的問題,甚至發(fā)生這些問題的Java類你沒都沒有聽說過。要搞清楚這里面的緣由,我們得學(xué)習(xí)Maven對依賴沖突的處理機(jī)制。

    ?

    Maven采用“最近獲勝策略(nearest wins strategy)”的方式處理依賴沖突,即如果一個(gè)項(xiàng)目最終依賴于相同artifact的多個(gè)版本,在依賴樹中離項(xiàng)目最近的那個(gè)版本將被使用。讓我們來看看一個(gè)實(shí)際的例子。

    ?

    請下載本文的github源代碼:https://github.com/davenkin/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

    ?

    ?

    由上可知,project-common:project-commmon:jar:2.0被忽略掉了。此時(shí)在resolve-web的war包中將只包含project-common的1.0版本,于是問題來了。由于project-common的1.0版本中不包含sayGoodBye()方法,而該方法正是project-C所需要的,所以運(yùn)行時(shí)將出現(xiàn)“NoSuchMethodError”。(請根據(jù)本文github工程中的README.md中的步驟重現(xiàn)該錯(cuò)誤信息。)

    ?

    對于這種有依賴沖突所導(dǎo)致的問題,我們有兩種解決方法。

    ?

    方法1:顯式加入對project-common 2.0版本的依賴。先前的2.0版本不是離resolve-web遠(yuǎn)了點(diǎn)嗎,那我們就直接將它作為resolve-web的依賴,這不就比1.0版本離resolve-web還近嗎?在resove-web的pom.xml文件中直接加上對project-common 2.0 的依賴:

    ?

    <dependency> <groupId>project-common</groupId> <artifactId>project-commmon</artifactId> <version>2.0</version> </dependency>

    ?

    方法2:resolve-web對project-A的dependency聲明中,將project-common排除掉。在resolve-web的pom.xml文件中修改對project-A的dependency聲明:

    ?

    <dependency> <groupId>project-A</groupId> <artifactId>project-A</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>project-common</groupId> <artifactId>project-commmon</artifactId> </exclusion> </exclusions> </dependency>

    ?

    此時(shí)再在resolve-web中執(zhí)行"mvn dependency:tree -Dverbose",結(jié)果如下:

    ?

    ......[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[INFO] +- project-A:project-A:jar:1.0:compile[INFO] \- javax.servlet:servlet-api:jar:2.4:provided......

    ?

    此時(shí)的依賴樹中已經(jīng)不包含project-common的1.0版本了。

    ?

    另外,我們還可以在project-A中將對project-common的依賴聲明為optional,optional即表示非transitive,此時(shí)當(dāng)在resolve-web中引用project-A時(shí),Maven并不會將project-common作為transitive依賴自動加入,除非有別的項(xiàng)目(比如project-B)聲明了對project-common的transitive依賴或者我們在resolve-web中顯式聲明對project-common的依賴(方法一)。

    ?

    在下一篇文章中,我們將講到如何編寫自己的Plugin。

    《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的Maven提高篇系列之(五)——处理依赖冲突的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。