如何處理 maven 依賴沖突焰雕?

PPT鏈接:https://ptteng.github.io/PPT/PPT/mavenConflicts.html#/
視頻鏈接:https://v.qq.com/x/page/v0520nb0tts.html

大家好雀扶,我是IT修真院北京分院第22期的學(xué)員童志榮灶似,一枚正直純潔善良的java程序員睬魂。

今天給大家分享一下幻林,修真院官網(wǎng)Java任務(wù)4贞盯,深度思考中的知識(shí)點(diǎn)————如何處理 maven 依賴沖突?

一沪饺、背景介紹
Java的強(qiáng)大之處就是在于它的生態(tài)環(huán)境躏敢,有眾多的第三方服務(wù)支持復(fù)雜項(xiàng)目的開發(fā)≌希基本上每個(gè)稍微有點(diǎn)規(guī)模的Java項(xiàng)目都會(huì)依賴到眾多的jar包件余,而Maven應(yīng)該是目前管理jar包依賴最流行的工具。

二遭居、知識(shí)剖析
Maven采用“最近獲勝策略(nearest wins strategy)”的方式處理依賴沖突啼器。換句話說,如果一個(gè)項(xiàng)目依賴于相同artifact的多個(gè)版本魏滚,在“依賴樹”中離項(xiàng)目最近的那個(gè)版本將被使用镀首。

三、常見問題
現(xiàn)在有一個(gè)web應(yīng)用resolve-web鼠次。
4個(gè)jar包:project-A更哄,project-B,project-C腥寇,project-Common成翩。

項(xiàng)目目錄.png

首先,我們針對(duì)只有sayHello()的 project-common赦役,設(shè)置其版本為1.0麻敌,并執(zhí)行mvn install。然后對(duì)其添加 sayGoodBye 方法掂摔,更改版本為2.0术羔,執(zhí)行mvn install赢赊。
現(xiàn)在,本地倉庫同時(shí)有了project-common 1.0和2.0的jar包级历。它們將分別被project-C 和 project-A 所依賴释移。

1.0和2.0同時(shí)有.png

resolve-web 依賴于project-A和project-B,
project-A依賴于project-common1.0的jar包寥殖,調(diào)用了其中的sayHello()方法玩讳。

package project.common;
//project-common的1.0版本
public class HelloWorld {
    public String sayHello() {
        return "hello world";
    }
}
package projectA;

import project.common.HelloWorld;

public class HelloService {

   private HelloWorld helloWorld;
   public HelloService(HelloWorld helloWorld) {
       this.helloWorld = helloWorld;
   }

   public String sayHello() {
       return helloWorld.sayHello();
   }
}

project-B依賴于project-C,而project-C又進(jìn)一步依賴于project-common2.0的jar包嚼贡,并調(diào)用其中的sayGoodBye()方法熏纯。

package project.common;

public class HelloWorld {
//project-common的1.0版本
    public String sayHello() {
        return "hello world";
    }
    public String sayGoodBye(){
        return "Good Bye";
    }
}

project-common的1.0和2.0版本唯一區(qū)別在于,1.0中包含sayHello()方法粤策,而2.0中包含了sayHello()和sayGoodBye()兩個(gè)方法樟澜。

根據(jù)maven的依賴傳遞機(jī)制,雖然 resolve-web 并未直接引用project-common掐场,但 B 依賴的 C 依賴了 common往扔,所以 web 項(xiàng)目最終依賴了 common 。同理熊户,web 項(xiàng)目也經(jīng)由 A 依賴了 common。
C 的 pom.xml 中:

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

A 的 pom.xml中:

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

現(xiàn)在整個(gè)項(xiàng)目的依賴圖呈現(xiàn)這樣的效果:

idea_maven依賴圖.png

或者吭服,在 resolve-web 目錄下執(zhí)行 “mvn dependency:tree -Dverbose”

omitConflict.png

也就是表明嚷堡,project-C 雖然在 pom 中指明了其依賴的是 project-common-2.0,但根據(jù)maven的“近者優(yōu)勝”策略艇棕,實(shí)質(zhì)上它引用的是1.0蝌戒。

所以這會(huì)造成什么后果呢?
讓我們啟動(dòng) resolve-web 項(xiàng)目沼琉,并訪問它的兩個(gè)servlet北苟,它們分別調(diào)用了 1.0和2.0 共有的sayHello() 方法 和2.0特有的sayGoodBye()方法。
在訪問goodbye路徑時(shí)報(bào)了錯(cuò):


goodbye.png

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

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

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


QQ截圖20170629222117.png

方法2是不是有一點(diǎn)巧妙呢胸梆?雖然project-common被排除在project-A的dependency聲明中了敦捧,但 project-A 自身的 pom 文件中依然存在對(duì) project-common 1.0 的依賴须板。導(dǎo)致了 maven 最終會(huì)將2.0作為project-c的依賴。

參考資料:Maven提高篇系列之(五)——處理依賴沖突

今天的分享就到這里啦兢卵,歡迎大家點(diǎn)贊习瑰、轉(zhuǎn)發(fā)、留言济蝉、拍磚~

技能樹.IT修真院“我們相信人人都可以成為一個(gè)工程師杰刽,現(xiàn)在開始,找個(gè)師兄王滤,帶你入門贺嫂,掌控自己學(xué)習(xí)的節(jié)奏,學(xué)習(xí)的路上不再迷醚阆纾”第喳。
這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學(xué)習(xí)路線踱稍,學(xué)習(xí)透明化曲饱,成長(zhǎng)可見化,師兄1對(duì)1免費(fèi)指導(dǎo)珠月±┑恚快來與我一起學(xué)習(xí)吧~我的邀請(qǐng)碼:11081435,或者你可以直接點(diǎn)擊此鏈接:http://www.jnshu.com/login/1/11081435

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啤挎,一起剝皮案震驚了整個(gè)濱河市驻谆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌庆聘,老刑警劉巖胜臊,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異伙判,居然都是意外死亡象对,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門宴抚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勒魔,“玉大人,你說我怎么就攤上這事酱塔×ち冢” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵羊娃,是天一觀的道長(zhǎng)唐全。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么邮利? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任弥雹,我火速辦了婚禮,結(jié)果婚禮上延届,老公的妹妹穿的比我還像新娘剪勿。我一直安慰自己,他們只是感情好方庭,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布厕吉。 她就那樣靜靜地躺著,像睡著了一般械念。 火紅的嫁衣襯著肌膚如雪头朱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天龄减,我揣著相機(jī)與錄音项钮,去河邊找鬼。 笑死希停,一個(gè)胖子當(dāng)著我的面吹牛烁巫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宠能,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼亚隙,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了违崇?” 一聲冷哼從身側(cè)響起恃鞋,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亦歉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畅哑,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肴楷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荠呐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赛蔫。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖泥张,靈堂內(nèi)的尸體忽然破棺而出呵恢,到底是詐尸還是另有隱情,我是刑警寧澤媚创,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布渗钉,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鳄橘。R本人自食惡果不足惜声离,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘫怜。 院中可真熱鬧术徊,春花似錦、人聲如沸鲸湃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暗挑。三九已至笋除,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窿祥,已是汗流浹背株憾。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晒衩,地道東北人嗤瞎。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像听系,于是被迫代替她去往敵國(guó)和親贝奇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理靠胜,服務(wù)發(fā)現(xiàn)掉瞳,斷路器,智...
    卡卡羅2017閱讀 134,716評(píng)論 18 139
  • 大家好浪漠,我是IT修真院北京分院第22期的學(xué)員童志榮陕习,一枚正直純潔善良的java程序員。 PPT戳這里 一址愿、背景介紹...
    tzr閱讀 1,951評(píng)論 1 2
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,867評(píng)論 6 342
  • 原文鏈接:http://www.dropwizard.io/1.2.0/docs/getting-started....
    Lance_Xu閱讀 913評(píng)論 0 0
  • 主要是修改配置文件 http.conf: 我的xampp版本是5.6 ,xampp升級(jí)后配置文件做了較大改動(dòng)该镣,網(wǎng)上...
    laotoutou閱讀 1,703評(píng)論 0 0