1. 程式人生 > 其它 >Maven依賴關係

Maven依賴關係

1.何為依賴?

我們在平時的專案開發中也是同理,你需要依賴一些東西才能實現相應的功能,但相應的功能或許也可以依賴其它的東西實現,比如資料庫操作吧,你可以依賴hibernate,但你也可以通過mybatis來做。

這就是所謂的依賴關係咯。

以前我們需要手動的去找hibernate或者mybatis的jar包,系統拋異常我們還不知哪裡報錯,通過琢磨才明白沒有引入相應的jar包,然後就去找啊找,找到了然後引入到工程當中。在這裡我們就看到maven的好處了,它就是一個倉庫,倉庫裡面有各種各樣的包,想要什麼就在pom.xml中依賴一下就好了,就算倉庫中沒有的包也可以把它扔到倉庫中,想用的時候就依賴一下。

2.依賴傳遞的範圍

(1)根據Jar包的不同,需要為其設定不同的傳遞方式,即傳遞範圍。Maven中的依賴傳遞範圍設定在<scope>標籤中。其取值有6種:

1)compile

第1類Jar包應設定的範圍。是預設值。其會向下傳遞該依賴。

2)test

第2類Jar包應設定的範圍。其不會向下傳遞該依賴。

3)provided

第3類Jar包應設定的範圍。其不會向下傳遞該依賴。

4)runtime

第4類Jar包應設定的範圍。其會向下傳遞該依賴。

5)system

不從本地倉庫查詢指定的依賴,而從<systemPath>路徑查詢。

3.依賴關係分類

A.直接依賴

專案A要用到別的專案B的架構的東西,所以專案A直接依賴B專案

B.間接依賴

專案B依賴A,C依賴B,那麼C間接依賴A

C.依賴傳遞性

Maven的依賴是具有傳遞性的,比如A-&gt;B,B-&gt;C,那麼A間接的依賴於C,這就是依賴的傳遞性,其中A對於B是第一直接依賴,B對於C是第二直接依賴,C為A的傳遞性依賴。

D.可選依賴與排除依賴

傳遞性依賴會給專案隱式的引入很多依賴,這極大的簡化了專案依賴的管理,但是有些時候這種特性也會帶來問題,它可能會把我們不需要的jar包也引入到了工程當中,使專案結構變得更復雜。或者你想替換掉預設的依賴換成自己想要的jar包,這時候就需要用到依賴排除。

例子中spring-core包依賴了commons-logging包,我們使用exclusions元素宣告排除依賴,exclusions可以包含一個或者多個exclusion子元素,因此可以排除一個或者多個傳遞性依賴。需要注意的是,宣告exclusions的時候只需要groupId和artifactId,而不需要version元素,這是因為只需要groupId和artifactId就能唯一定位依賴圖中的某個依賴。換句話說,Maven解析後的依賴中,不可能出現groupId和artifactId相同,但是version不同的兩個依賴。

E.依賴衝突(調解)

下面我們來思考這樣一個問題,如果A-&gt;B-&gt;C-&gt;X(1.0),A-&gt;D-X(2.0),即A間接依賴X,我們可以看到有兩條路徑都依賴X,那麼maven將會選擇哪個版本的X?maven當中有一套自己的規則,我們來說明一下,maven傳遞性依賴的一些規則以及如何排除依賴衝突。

Maven裡面對於傳遞性依賴有以下幾個規則:

1.最短路徑原則:如果A對於依賴路徑中有兩個相同的jar包,那麼選擇路徑短的那個包,路徑最近者優先,上述會選X(2.0)。

2.第一宣告優先原則:如果A對於依賴路徑中有兩個相同的jar包,路徑長度也相同,那麼依賴寫在前面的優先。例如:A->B->F(1.0),A->C->F(2.0),會選F(1.0)。

3.可選依賴不會被傳遞,如A->B,B->;C,B->;D,A對B直接依賴,B對C和D是可選依賴,那麼在A中不會引入C和D。可選依賴通過optional元素配置,true表示可選。如果要在A專案中使用C或者D則需要顯式地宣告C或者D依賴。

版本號統一管理

聚合

在Maven中,可能我們要做多個test,但是一個一個的測試去做,這樣會很麻煩,為了簡單方便,我們把所有的test package,都匯聚到一個package中,我們利用這個測試可以進行所有的test的測試,這個過程就是聚合。目前菜鳥的水平來看這個聚合,主要功能就是方便Test的!