網頁

2021/5/2

Maven 依賴機制的 依賴傳遞 transitive dependencies

本篇介紹Maven依賴機制的依賴傳遞特性(Transitive Dependencies)。


先簡單解釋什麼叫依賴(dependency),Maven的依賴通常是指專案所使用的外部函式庫/套件(library),例如第三方函式庫/框架Apache Commons Lang、Spring Boot、Spring Data JPA、JUnit或公司團隊開發的函式庫等,也就是pom.xml<dependencies>中設定的那些函式庫。

Maven的依賴傳遞特性讓我們無需指明專案的依賴的依賴。Maven藉由讀取依賴的pom.xml文件來得知其依賴並從遠端倉庫(remote repository)下載至專案並以此類推。

然而依賴傳遞特性會令專案隨著依賴增加而加入更多的依賴函式庫,為了減少函式庫及解決依賴間衝突的問題採取了以下機制。


依賴調節 Dependency mediation

當專案使用的函式庫依賴有多個版本時,Maven會選擇依賴樹中最接近專案階層的版本。若同個依賴的不同版本在依賴樹中的階層相同,則會選擇順序在先的版本。

例如專案的依賴樹如下,專案A依賴了B與E;B依賴C,C依賴D 2.0;E依賴D 1.0。則在建構A專案時會使用D 1.0,因為D 1.0的階層路徑較接近專案A。

A
├── B
│   └── C
│       └── D 2.0
└── E
    └── D 1.0

如果A必須使用D 2.0,則可在依賴中明確指定D 2.0的依賴,此時依賴樹如下。

A
├── B
│   └── C
│       └── D 2.0
├── E
│   └── D 1.0
│
└── D 2.0 <-- 指定對D 2.0的依賴

依賴管理 Dependency management

專案可集中管理使用的依賴、繼承或匯入其他專案的依賴及指定加入的依賴版本等。


依賴範圍 Dependency scope

可指定依賴僅用在特定的建構階段,也就是在指定的建構階段才會把依賴納入專案的classpath。


排除依賴 Excluded dependencies

若A依賴B,B又依賴C,A可以指定排除依賴C。


選擇性依賴 Optional dependencies

B依賴C,B設定C為選擇性依賴。當A依賴B時A只會加入B但不會加入C,A必須自行加入依賴C。


雖然依賴傳遞特性會自動取得依賴的依賴,但專案如有使用特定依賴仍應指明所使用的依賴來避免當依賴更新後移除原有的依賴造成專案建構時發生找不依賴的錯誤。此外明確指定專案使用的依賴也可讓開發人員可從pom.xml文件或執行mvn dependency:tree命令清楚了解專案依賴的使用情形。


沒有留言:

張貼留言