Maven依赖详细理解
Maven依賴?yán)斫?/h3>- 1 簡(jiǎn)介
- 2 依賴的配置
- 3 依賴的范圍
- 4 傳遞性依賴
- 4.1 傳遞性依賴和依賴調(diào)解
- 5 依賴調(diào)解
- 6 可選依賴
- 7 總結(jié)
- 8 下載
- 4.1 傳遞性依賴和依賴調(diào)解
1 簡(jiǎn)介
?在Maven項(xiàng)目中,有一個(gè)核心文件pom.xml。POM項(xiàng)目對(duì)象模型定義了項(xiàng)目的基本信息,用于描述心目如何構(gòu)建,聲明項(xiàng)目依賴。
?沒(méi)有任何的實(shí)際Java代碼,我們就能頂一個(gè)Maven項(xiàng)目的POM,這體現(xiàn)了Maven的一大優(yōu)點(diǎn),它能讓項(xiàng)目對(duì)象模型最大程度地與實(shí)際代碼相互獨(dú)立,即解耦,或者正交性。這在很大程度上避免了Java代碼和POM代碼的相互影響。比如當(dāng)項(xiàng)目需要升級(jí)版本時(shí),只需要修改POM,而不需要更待Java代碼;而在POM穩(wěn)定之后,日常的Java代碼開(kāi)發(fā)工作基本不涉及POM的修改。
下面的pom文件即為一個(gè)xml
在POM文件中標(biāo)簽下的每個(gè)即表示該項(xiàng)目的一個(gè)直接依賴。
2 依賴的配置
?從上述的簡(jiǎn)單pom.xml文件中,可以看到Maven項(xiàng)目的依賴聲明如下:
<project><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><type>…</type><scope>…</scope><optional>…</optional><exclusions><exclusion>…</ exclusion><exclusion>…</ exclusion></exclusions></dependency></dependencies> </project>根元素project下的dependencies可以包含一個(gè)或者多個(gè)dependency元素,以聲明一個(gè)或多個(gè)項(xiàng)目依賴。
3 依賴的范圍
Maven在編譯項(xiàng)目、測(cè)試項(xiàng)目、以及運(yùn)行項(xiàng)目時(shí)使用三套classpath。編譯時(shí)classpath為src/main/resources,測(cè)試時(shí)classpath為src/test/resources,在運(yùn)行時(shí)classpath則為target/classes。
依賴范圍就是用來(lái)控制依賴與這三種classpath(編譯classpath、測(cè)試classpath、運(yùn)行classpath)的關(guān)系。
不考慮import依賴范圍,其他各種依賴范圍與三種classpath的關(guān)系參見(jiàn)Maven依賴范圍與classpath、依賴傳遞如圖:
4 傳遞性依賴
?Maven在幫助開(kāi)發(fā)人員根據(jù)POM下載依賴時(shí),會(huì)自動(dòng)解析Maven項(xiàng)目的依賴,包括直接在POM文件中定義的直接依賴,以及每個(gè)依賴依賴的其他依賴。這個(gè)過(guò)程會(huì)自動(dòng)進(jìn)行,不需要手動(dòng)干預(yù)。
spring-core有一個(gè)依賴commons-logging依賴。
?該依賴沒(méi)有聲明依賴范圍,那么其依賴范圍就是默認(rèn)的compile。因此依賴圖示如下:
?通過(guò)傳遞性依賴機(jī)制,Maven項(xiàng)目就不需要考慮它依賴了什么,也不用擔(dān)心引入多余的依賴。Maven會(huì)解析各個(gè)直接的POM,將那些必要的間接依賴以傳遞性依賴的形式引入到當(dāng)前項(xiàng)目中。
4.1 傳遞性依賴和依賴調(diào)解
?假設(shè)A依賴B,B依賴C,我們說(shuō)A對(duì)于B是第一直接依賴,B對(duì)于C是第二直接依賴。A對(duì)于C是傳遞性依賴。第一直接依賴的范圍和第二直接依賴的范圍決定了傳遞性依賴的范圍。下表中,最左邊表示第一直接依賴范圍,最上邊為第二直接依賴范圍,中間的交叉單元格則表示傳遞性依賴范圍。
?通過(guò)查看上圖,可以發(fā)現(xiàn)這樣的規(guī)律,當(dāng)?shù)诙苯右蕾嚨姆秶鸀閏ompile的時(shí)候,傳遞性依賴范圍與第一直接依賴的范圍一致。當(dāng)?shù)诙苯右蕾嚨姆秶鸀閠est的時(shí)候,依賴不會(huì)傳遞;當(dāng)?shù)诙苯右蕾嚨姆秶鸀槭莗rovided的時(shí)候,只傳遞第一直接依賴范圍也為provided的依賴,且傳遞性依賴范圍同樣為provided;當(dāng)?shù)诙苯右蕾嚨姆秶莚untime的時(shí)候,傳遞性依賴的范圍與第一直接依賴一致,但compile例外,此時(shí)傳遞性依賴的范圍為runtime
5 依賴調(diào)解
?大部分情況下,我們只需要關(guān)心項(xiàng)目的直接依賴是什么,而不用考慮這些依賴會(huì)引入什么傳遞性依賴,當(dāng)傳遞性依賴造成問(wèn)題的時(shí)候,則需要清楚的知道該傳遞性依賴是從那條依賴路徑引入的。
6 可選依賴
?一種場(chǎng)景是A–>B, B–>X(可選),B–>Y(可選),如果這三個(gè)依賴的范圍都是compile,那么X、Y、就是A的compile范圍傳遞性依賴。然而由于這里X、Y是可選依賴,依賴不會(huì)傳遞。換句話說(shuō)X、Y不會(huì)對(duì)A有任何影響。
項(xiàng)目B實(shí)現(xiàn)了兩個(gè)特性,其中一項(xiàng)特性依賴X,另一項(xiàng)特性依賴Y,而且兩個(gè)特性是互斥的。
?上述圖片中,使用表示依賴是可選的。它們zhi 對(duì)當(dāng)前項(xiàng)目B產(chǎn)生影響,當(dāng)其他項(xiàng)目需要依賴B的時(shí)候,這兩個(gè)依賴不會(huì)傳遞,因此,當(dāng)項(xiàng)目A依賴于項(xiàng)目B的時(shí)候,如果其實(shí)際使用MySQL數(shù)據(jù)庫(kù),那么在項(xiàng)目A中就必須顯式的聲明mysql-connector-java這個(gè)依賴。
?在理想的情況下,是不應(yīng)該使用可選依賴的。使用可選依賴的原因是一個(gè)項(xiàng)目實(shí)現(xiàn)了多個(gè)特性,在面向?qū)ο笤O(shè)計(jì)中,存在單一職責(zé)原則,意為一個(gè)類(lèi)應(yīng)該只有一個(gè)原則,而不是糅合太多的功能,這個(gè)原則在規(guī)劃Maven項(xiàng)目的時(shí)候同樣適用。
7 總結(jié)
?本文章總結(jié)了Maven實(shí)戰(zhàn)p62—p68的內(nèi)容。主要內(nèi)容包括Maven項(xiàng)目中依賴聲明的格式,依賴范圍的含義傳遞性依賴和依賴范圍,以及依賴調(diào)解的兩個(gè)原則。最后對(duì)于可選依賴的使用進(jìn)行了簡(jiǎn)要的闡述,希望能夠通過(guò)該文檔增加對(duì)依賴?yán)斫獾纳疃取?/p>
8 下載
Maven 依賴詳細(xì)理解.pdf
2019年6月7日17:22:55端午第一天于馬塍路36號(hào)總結(jié)
以上是生活随笔為你收集整理的Maven依赖详细理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 服务器10GE网卡识别失败
- 下一篇: Mathematica