Maven 依賴管理

摘要

作為開發者,我們一直使用 Maven 來作為版本依賴管理工具,不過我們經常會遇到依賴衝突等問題,我們這邊文章就來明確一下 Maven 是如何管理依賴與版本的。

Maven 版本結構

Maven的版本結構使用如下格式:

MajorVersion [ .MinorVersion [ .IncrementalVersion ] ] [ -Qualifier [ -BuildNumber ] ]

MajorVersion, MinorVersion, IncrementalVersion 和 BuildNumber 都需要是數字, Qualifier 是一個字符串。如果你的版本格式不符合這個要求,Maven 會將整個版本看成一個 Qualifier 字符串


版本號也隱含了兼容性

MajorVersion: 修改是非向後兼容的,使用新版本以為要做重大改動

MinorVersion: 修改是向後兼容的,一般表示引入了新功能

IncrementalVersion: 修改是向後兼容的,一般用於bug 修復

Maven依賴的選擇策略

假設有一個項目P, 它有如下的依賴圖:

Maven 依賴管理

那我們在構建的時候,哪些依賴會包含在構建中呢?


這就涉及到Maven的依賴選擇策略,Maven 有兩條依賴選擇規則:

1. 距離根節點最近的依賴會被選擇使用

2. 如果同一個依賴有多個版本處在同一層,首先聲明的會被選擇使用

因此按照上圖,項目P的所選擇的依賴為 [X, Y, Z 1.0].


但是如果我們想要使用 Z 2.0呢?我們有幾種辦法可以做:

1. 根據選擇策略1, 我們可以直接在 pom 中聲明 Z 2.0 依賴

2. 根據選擇策略2, 我們可以調整 Y 在 pom 中聲明的順序到 X 之前

3. 我們可以使用 exclude 方式將 Z 1.0 排除出依賴

總結

Maven的依賴管理很靈活,但是當有很多的依賴時,很容易會造成依賴選擇的不正確。其實更真實的說法是,Maven 使用的這種依賴選擇策略是有問題的,當遇到依賴衝突時,拋出異常由程序員決定選擇哪個依賴是更好的選擇,Maven 的這種選擇依賴的方式運氣好一點的在啟動或測試時發現,運氣不好等到上線甚至埋藏很久才會運行異常,而越晚發現代價就越大。


分享到:


相關文章: