maven学习系列——(七)Dependency
Dependency介紹
本文轉(zhuǎn)自:Maven簡(jiǎn)介(六)——Dependency,并加上自己在實(shí)際使用中的總結(jié)和說明!
1、依賴的傳遞性
依賴傳遞對(duì)版本的選擇
假設(shè)A依賴于B和C,然后B依賴于D,D又依賴于E1.0,C直接依賴于E2.0,那么這個(gè)時(shí)候A依賴的是E1.0還是E2.0,還是這兩個(gè)都依賴呢?兩個(gè)都依賴是肯定不行的,因?yàn)樗鼈兛赡軙?huì)有沖突的地方。這個(gè)時(shí)候就涉及到Maven中依賴傳遞對(duì)版本的選擇問題。依賴傳遞在選擇版本的時(shí)候首先是根據(jù)深度選擇的。當(dāng)一個(gè)項(xiàng)目同時(shí)經(jīng)過不同的路徑依賴于同一個(gè)組件時(shí),會(huì)選擇其深度最短的對(duì)應(yīng)組件進(jìn)行依賴。
舉例來說:
第一種情況:
- A->B->C->D1.0
- A->E->D2.0
那么這個(gè)時(shí)候A就會(huì)選擇對(duì)D 相對(duì)路徑短 的組件來進(jìn)行依賴,也就是D2.0。
那么當(dāng)深度一樣的時(shí)候Maven會(huì)如何選擇呢?
- A->B->D1.0
- A->C->D2.0
這個(gè)時(shí)候Maven會(huì)如何選擇A所依賴的D的版本呢?
這種情況Maven會(huì)根據(jù)申明的依賴順序來進(jìn)行選擇,先申明的會(huì)被作為依賴包。像前面這種情況,如果先申明對(duì)B的依賴,則A依賴的就是D1.0;如果先申明對(duì)C的依賴,則A依賴的就是D2.0。
總結(jié):
1、路徑相同的情況,會(huì)根據(jù)申明的依賴順序來進(jìn)行選擇,先申明的會(huì)被作為依賴包。
2、路徑不同的情況,采用 深度最短的對(duì)應(yīng)組件進(jìn)行依賴。
使用exclusion排除依賴
假設(shè)有這樣一種依賴關(guān)系,A->B->C,這個(gè)時(shí)候由于某些原因,我們不需要對(duì)C的依賴,但是我們又必須要對(duì)B的依賴,這個(gè)時(shí)候該怎么辦呢?針對(duì)這種情況,Maven給我們提供了一個(gè)exclusion功能,我們可以在添加A對(duì)B的依賴時(shí)申明不需要引進(jìn)B對(duì)C的依賴。具體做法如下:
<dependencies> <dependency> <groupId>groupB</groupId> <artifactId>artifactB</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>groupC</groupId> <artifactId>artifactC</artifactId> </exclusion> </exclusions> </dependency> ... </dependencies>總結(jié):
exclusions: 在實(shí)際項(xiàng)目中使用的還是比較多,可以解決:
1、依賴傳遞問題
2、版本沖突問題
2、 依賴項(xiàng)的作用域
test:表示該依賴項(xiàng)只對(duì)測(cè)試時(shí)有用,包括測(cè)試代碼的編譯和運(yùn)行,對(duì)于正常的項(xiàng)目運(yùn)行是沒有影響的。
比如:Junit jar、Spring-test jar
provided:表示該依賴項(xiàng)將由JDK或者運(yùn)行容器在運(yùn)行時(shí)提供,也就是說由Maven提供的該依賴項(xiàng)我們只有在編譯和測(cè)試時(shí)才會(huì)用到,而在運(yùn)行時(shí)將由JDK或者運(yùn)行容器提供
比如:servlet-api jar
compile:這是依賴項(xiàng)的默認(rèn)作用范圍,即當(dāng)沒有指定依賴項(xiàng)的scope時(shí)默認(rèn)使用compile。compile范圍內(nèi)的依賴項(xiàng)在所有情況下都是有效的,包括運(yùn)行、測(cè)試和編譯時(shí)。
runtime:表示該依賴項(xiàng)只有在運(yùn)行時(shí)才是需要的,在編譯的時(shí)候不需要。這種類型的依賴項(xiàng)將在運(yùn)行和test的類路徑下可以訪問。
比如:mysql-connector-java jar
3、dependencyManagement介紹
使用的配置如下:
<project> ... <dependencyManagement> <dependencies> <dependency> <groupId>groupC</groupId> <artifactId>artifactC</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>groupD</groupId> <artifactId>artifactD</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>groupE</groupId> <artifactId>artifactE</artifactId> <version>1.0</version> <type>bar</type> </dependency> </dependencies> </dependencyManagement> ... </project>
總結(jié):
1、集中管理依賴項(xiàng)和依賴項(xiàng)使用的版本進(jìn)行統(tǒng)一管理。
2、子項(xiàng)目需要直接引用才有能引入自己需要的依賴包,不需要在寫版本號(hào)!
3、開源項(xiàng)目中使用較多,這個(gè)在大型項(xiàng)目或者jar依賴較多的項(xiàng)目必須使用!!!一定要學(xué)會(huì)使用方法。
子項(xiàng)目使用方法:
<dependencies> <dependency> <groupId>groupC</groupId> <artifactId>artifactC</artifactId> <!-- 不需要指定版本,會(huì)依賴父類統(tǒng)一管理版本--></dependency> </dependencies>總結(jié)
以上是生活随笔為你收集整理的maven学习系列——(七)Dependency的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星s9更新android9.0,三星G
- 下一篇: 百度离线地图下载器+开发Demo(街道、