Maven依賴沖突你會(huì)怎么解決

直奔主題癌淮,課外知識(shí)自行腦補(bǔ)肚菠。

1健蕊、傳遞依賴和繼承依賴

繼承依賴是個(gè)啥菱阵?就是你定義了一個(gè)父模塊,然后子模塊的pom里定義了parent去引用父模塊缩功,然后子模塊會(huì)繼承父模塊的聲明晴及。

再簡(jiǎn)單多說(shuō)一句多模塊和繼承的在編譯時(shí)的玩法:

1、有依賴關(guān)系的多模塊項(xiàng)目嫡锌,工程結(jié)構(gòu)如下圖

1)直接編譯父項(xiàng)目虑稼。maven會(huì)通過(guò)Reactor機(jī)制制定編譯順序(maven會(huì)找到各子module的關(guān)系),maven知道父模塊下的所有子模塊势木,并會(huì)按照依賴關(guān)系依次處理執(zhí)行依次編譯所有項(xiàng)目蛛倦。

2)編譯maven子項(xiàng)目時(shí),maven不僅對(duì)子項(xiàng)目編譯執(zhí)行啦桌,也編譯執(zhí)行了父項(xiàng)目溯壶,但不會(huì)編譯兄弟項(xiàng)目及其兄弟項(xiàng)目的子項(xiàng)目。

2震蒋、不具有依賴關(guān)系的多模塊項(xiàng)目

即兄弟項(xiàng)目間互不關(guān)聯(lián),都只與父項(xiàng)目存在依賴關(guān)系躲庄。表現(xiàn)就是對(duì)于這類型的項(xiàng)目查剖,我們可以刪除父模塊的...</modules>部分,而子模塊保留parent部分噪窘。此時(shí)項(xiàng)目不再是一個(gè)多模塊項(xiàng)目笋庄,而是多工程項(xiàng)目的一個(gè)集合。

1)此時(shí)編譯父模塊就只會(huì)編譯父模塊自己。

2)編譯子模塊時(shí)直砂,會(huì)將子模塊和父模塊一塊編譯菌仁,但不會(huì)編譯兄弟模塊。

3)若保留父模塊的<modules>...</modules>部分而刪除子模塊的parent部分静暂,那么項(xiàng)目不再是父子項(xiàng)目济丘,只是一個(gè)多模塊項(xiàng)目,每個(gè)子項(xiàng)目獨(dú)享自己的資源洽蛀,不能共享摹迷。

跑題了,接著講:

一郊供、繼承依賴峡碉,

只需記住這句:子模塊會(huì)依賴父模塊的聲明,若子模塊單獨(dú)聲明驮审,就用自己的鲫寄。

二、傳遞依賴

假如A依賴B,B依賴C疯淫,那么A也依賴C地来。(也有例外啊,如果B依賴C時(shí)指定了optional為true峡竣,標(biāo)記為可選依賴靠抑,則A不會(huì)依賴C)劲室。

傳遞性依賴有以下幾個(gè)規(guī)則:

1)???????? 最短路徑原則:如果A對(duì)于依賴路徑中有兩個(gè)相同的jar包兔综,那么選擇路徑短的那個(gè)包,路徑最近者優(yōu)先沫换,上述會(huì)選X(2.0)类浪。

2)???????? 第一聲明優(yōu)先原則:如果A對(duì)于依賴路徑中有兩個(gè)相同的jar包载城,路徑長(zhǎng)度也相同,那么依賴寫在前面的優(yōu)先费就。例如:A->B->F(1.0),A->C->F(2.0)诉瓦,會(huì)選F(1.0)。

3)???????? 可選依賴不會(huì)被傳遞力细,如A->B,B->C,B->D,A對(duì)B直接依賴睬澡,B對(duì)C和D是可選依賴,那么在A中不會(huì)引入C和D眠蚂∩反希可選依賴通過(guò)optional元素配置,true表示可選逝慧。如果要在A項(xiàng)目中使用C或者D則需要顯式地聲明C或者D依賴昔脯。

講到這里說(shuō)說(shuō)今天要說(shuō)的重點(diǎn)啄糙,也是寫這篇文章的緣由,Maven dependencyManagement中的依賴版本會(huì)覆蓋傳遞依賴版本云稚。

現(xiàn)在有如下工程:maven_dep_demo 是父module隧饼,有dao,service,web三個(gè)子module,子module的依賴關(guān)系dao->service->web.


回答完下面幾道題静陈,maven的一些基礎(chǔ)依賴燕雁,你基本就理解的差不多了,一定要自己下去多試窿给,答題時(shí)間開始:

第一題:

1)dao引用了spring-core的5.1.6.

2)service只是引用的dao

3)web 在dependencyManagement中定義了spring-core 的版本是4.3.23

那大家猜一下贵白,在dao,service 和web中顯示的spring的版本號(hào)是什么?

答案是:

結(jié)論:pom文件中沒(méi)有指定版本的依賴或是傳遞的依賴崩泡,如果在本module中dependencyManagement中有指定此依賴版本禁荒,那就使用本module中dependencyManagement中定義的版本號(hào)。

第二題:

1)dao引用了spring-core的5.1.6.如上

2)service只是引用的dao,如上

3)web 只是引用了service角撞。

4)父pom中在dependencyManagement中定義了spring-core 的版本是4.3.23.RELEASE


那大家猜一下呛伴,在dao,service 和web中顯示的spring的版本號(hào)是什么??

結(jié)論:如果在dependency中沒(méi)有指定version谒所,那么就會(huì)依次找當(dāng)前pom中以及父pom中的dependencyManagement是否定義了版本热康。

第三題:

1)dao引用了spring-core的5.1.6.如上

2)service只是引用的dao,如上

3)web 在dependencyManagement中定義了spring-core 的版本是4.3.23

4)父pom中在dependencyManagement中定義了spring-core 的版本是3.2.9


那大家猜一下劣领,在dao,service 和web中顯示的spring的版本號(hào)是什么姐军??

結(jié)論:子的永遠(yuǎn)優(yōu)先父的。

第四題:

1)我給原來(lái)的工程里添加一個(gè)module叫common尖淘,common繼承父pom奕锌。common中引用spring3


2)dao引用了spring-core的5.1.6.

3)service只是引用的dao

4)在web里定義dependencyManagement引用common,且web引用service村生。

那大家猜一下惊暴,在dao,service 和web中顯示的spring的版本號(hào)是什么??

第五題:

1)我給原來(lái)的工程里添加一個(gè)module叫common趁桃,common繼承父pom辽话。common中引用spring3


2)dao引用了spring-core的5.1.6.

3)service只是引用的dao

4)在web引用service。卫病。

5)在父pom里定義dependencyManagement引用common

那大家猜一下油啤,在dao,service 和web中顯示的spring的版本號(hào)是什么??

結(jié)論:dependencyManagement的定義不具有傳遞性蟀苛。

第六題:

1)我給原來(lái)的工程里添加一個(gè)module叫common益咬,common繼承父pom。


common中只是dependencyManagementspring3.2.9

2)dao引用了spring-core的5.1.6.

3)service只是引用的dao

4)在web引用service屹逛。础废。

5)在父pom里空的。

6)web的引用common

那大家猜一下罕模,在dao,service 和web中顯示的spring的版本號(hào)是什么评腺??

第七題:

1)我給原來(lái)的工程里添加一個(gè)module叫common,common繼承父pom淑掌。


common中dependencyManagement?spring3.2.9且依賴蒿讥。

2)dao引用了spring-core的5.1.6.

3)service只是引用的dao

4)在web引用service。抛腕。

5)在父pom里空的芋绸。

6)web的引用common

那大家猜一下,在dao,service 和web中顯示的spring的版本號(hào)是什么担敌??

dao 和 service 變成了spring5摔敛,web中變成了這樣


第八題:

1)我給原來(lái)的工程里添加一個(gè)module叫common,common繼承父pom全封。如上

common中只是dependencyManagement?

2)dao引用了spring-core的5.1.6.

3)service只是引用的dao

4)在web引用service马昙。。

5)在父pom里空的刹悴。

6)web的引用common行楞,但是type是pom,scope是import


那大家猜一下,在dao,service 和web中顯示的spring的版本號(hào)是什么土匀??

dao 和 service 變成了spring5子房,web中變成了這樣


第九題:

1)我給原來(lái)的工程里添加一個(gè)module叫common,common繼承父pom就轧。如上

common中只是dependencyManagement?

2)dao引用了spring-core的5.1.6.

3)service只是引用的dao

4)在web引用service证杭。。

5)在父pom里dependencyManagement common钓丰,但是type是pom,scope是import躯砰。

6)web的引用common

那大家猜一下,在dao,service 和web中顯示的spring的版本號(hào)是什么携丁??

dao是spring 5琢歇, service 和web 變成了spring3,web中變成了這樣

結(jié)論:import就是把pom的配置導(dǎo)進(jìn)來(lái)梦鉴。跟你寫在里面差不多李茫。

綜上所述:

1、pom文件中沒(méi)有指定版本的依賴或是傳遞的依賴肥橙,如果在本module中dependencyManagement中有指定此依賴版本魄宏,那就使用本module中dependencyManagement中定義的版本號(hào)。

2存筏、如果在dependency中沒(méi)有指定version宠互,那么就會(huì)依次找當(dāng)前pom中以及父pom中的dependencyManagement是否定義了版本味榛。

3、子的永遠(yuǎn)優(yōu)先父的予跌。

4搏色、dependencyManagement的定義不具有傳遞性。

5券册、import就是把pom的配置導(dǎo)進(jìn)來(lái)

6频轿、工具不好用就,就用命令吧maven -X dependency:tree

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末烁焙,一起剝皮案震驚了整個(gè)濱河市航邢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌骄蝇,老刑警劉巖膳殷,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異九火,居然都是意外死亡秽之,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門吃既,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)考榨,“玉大人,你說(shuō)我怎么就攤上這事鹦倚『又剩” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵震叙,是天一觀的道長(zhǎng)掀鹅。 經(jīng)常有香客問(wèn)我,道長(zhǎng)媒楼,這世上最難降的妖魔是什么乐尊? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮划址,結(jié)果婚禮上扔嵌,老公的妹妹穿的比我還像新娘。我一直安慰自己夺颤,他們只是感情好痢缎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著世澜,像睡著了一般独旷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天嵌洼,我揣著相機(jī)與錄音案疲,去河邊找鬼。 笑死麻养,一個(gè)胖子當(dāng)著我的面吹牛络拌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播回溺,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼混萝!你這毒婦竟也來(lái)了遗遵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤逸嘀,失蹤者是張志新(化名)和其女友劉穎车要,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崭倘,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翼岁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了司光。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琅坡。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖残家,靈堂內(nèi)的尸體忽然破棺而出榆俺,到底是詐尸還是另有隱情,我是刑警寧澤坞淮,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布茴晋,位于F島的核電站,受9級(jí)特大地震影響回窘,放射性物質(zhì)發(fā)生泄漏诺擅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一啡直、第九天 我趴在偏房一處隱蔽的房頂上張望烁涌。 院中可真熱鬧,春花似錦酒觅、人聲如沸烹玉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)二打。三九已至,卻和暖如春掂榔,著一層夾襖步出監(jiān)牢的瞬間继效,已是汗流浹背症杏。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瑞信,地道東北人厉颤。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像凡简,于是被迫代替她去往敵國(guó)和親逼友。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349