1. 程式人生 > >maven學習系列——(七)Dependency

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 相對路徑短

的元件來進行依賴,也就是D2.0

那麼當深度一樣的時候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>