讀古今文學網 > Maven實戰 > 5.7 依賴調解 >

5.7 依賴調解

Maven引入的傳遞性依賴機制,一方面大大簡化和方便了依賴聲明,另一方面,大部分情況下我們只需要關心項目的直接依賴是什麼,而不用考慮這些直接依賴會引入什麼傳遞性依賴。但有時候,當傳遞性依賴造成問題的時候,我們就需要清楚地知道該傳遞性依賴是從哪條依賴路徑引入的。

例如,項目A有這樣的依賴關係:A->B->C->X(1.0)、A->D->X(2.0),X是A的傳遞性依賴,但是兩條依賴路徑上有兩個版本的X,那麼哪個X會被Maven解析使用呢?兩個版本都被解析顯然是不對的,因為那會造成依賴重複,因此必須選擇一個。Maven依賴調解(Dependency Mediation)的第一原則是:路徑最近者優先。該例中X(1.0)的路徑長度為3,而X(2.0)的路徑長度為2,因此X(2.0)會被解析使用。

依賴調解第一原則不能解決所有問題,比如這樣的依賴關係:A->B->Y(1.0)、A->C->Y(2.0),Y(1.0)和Y(2.0)的依賴路徑長度是一樣的,都為2。那麼到底誰會被解析使用呢?在Maven 2.0.8及之前的版本中,這是不確定的,但是從Maven 2.0.9開始,為了盡可能避免構建的不確定性,Maven定義了依賴調解的第二原則:第一聲明者優先。在依賴路徑長度相等的前提下,在POM中依賴聲明的順序決定了誰會被解析使用,順序最靠前的那個依賴優勝。該例中,如果B的依賴聲明在C之前,那麼Y(1.0)就會被解析使用。