maven學習系列——(七)Dependency
Dependency介紹
1、依賴的傳遞性
依賴傳遞對版本的選擇
假設A依賴於B和C,然後B依賴於D,D又依賴於E1.0,C直接依賴於E2.0,那麼這個時候A依賴的是E1.0還是E2.0,還是這兩個都依賴呢?兩個都依賴是肯定不行的,因為它們可能會有衝突的地方。這個時候就涉及到Maven中依賴傳遞對版本的選擇問題。依賴傳遞在選擇版本的時候首先是根據深度選擇的。當一個專案同時經過不同的路徑依賴於同一個元件時,會選擇其深度最短的對應元件進行依賴。
舉例來說:
第一種情況:
- A->B->C->D1.0
- A->E->D2.0
那麼這個時候A就會選擇對D 相對路徑短
那麼當深度一樣的時候Maven會如何選擇呢?
- A->B->D1.0
- A->C->D2.0
這個時候Maven會如何選擇A所依賴的D的版本呢?
這種情況Maven會根據申明的依賴順序來進行選擇,先申明的會被作為依賴包。像前面這種情況,如果先申明對B的依賴,則A依賴的就是D1.0;如果先申明對C的依賴,則A依賴的就是D2.0。
總結:
1、路徑相同的情況,會根據申明的依賴順序來進行選擇,先申明的會被作為依賴包。
2、路徑不同的情況,採用 深度最短的對應元件進行依賴。
使用exclusion排除依賴
假設有這樣一種依賴關係,A->B->C,這個時候由於某些原因,我們不需要對C的依賴,但是我們又必須要對B的依賴,這個時候該怎麼辦呢?針對這種情況,Maven給我們提供了一個exclusion功能,我們可以在新增A對B的依賴時申明不需要引進B對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>
總結:
exclusions: 在實際專案中使用的還是比較多,可以解決:
1、依賴傳遞問題
2、版本衝突問題
2、 依賴項的作用域
test:表示該依賴項只對測試時有用,包括測試程式碼的編譯和執行,對於正常的專案執行是沒有影響的。
比如:Junit jar、Spring-test jar
provided:表示該依賴項將由JDK或者執行容器在執行時提供,也就是說由Maven提供的該依賴項我們只有在編譯和測試時才會用到,而在執行時將由JDK或者執行容器提供
比如:servlet-api jar
compile:這是依賴項的預設作用範圍,即當沒有指定依賴項的scope時預設使用compile。compile範圍內的依賴項在所有情況下都是有效的,包括執行、測試和編譯時。
runtime:表示該依賴項只有在執行時才是需要的,在編譯的時候不需要。這種型別的依賴項將在執行和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>
總結:
1、集中管理依賴項和依賴項使用的版本進行統一管理。
2、子專案需要直接引用才有能引入自己需要的依賴包,不需要在寫版本號!
3、開源專案中使用較多,這個在大型專案或者jar依賴較多的專案必須使用!!!一定要學會使用方法。
子專案使用方法:
<dependencies>
<dependency>
<groupId>groupC</groupId>
<artifactId>artifactC</artifactId>
<!-- 不需要指定版本,會依賴父類統一管理版本-->
</dependency>
</dependencies>