直奔主題癌淮,課外知識(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