對于 Java 開發工程師來說,Maven 是依賴管理和代碼構建的標準,遵循「約定大于配置」理念,Maven 是 Java 開發工程師日常使用的工具,本篇文章簡要介紹一下 Maven 的依賴樹決議,
依賴樹結構
在 pom.xml 的 dependencies 中宣告依賴包后,Maven 將直接引入依賴,并通過決議直接依賴的 pom.xml 將傳遞性依賴匯入到當前專案,最終形成一個樹狀的依賴結構,
原則:深度優先遍歷依賴,并快取節點剪枝,比如下圖:
- A→B→D→E/F
- A→C→D
在第二步A→C→D時,由于節點D已經被快取,所以會立即回傳,不必再次遍歷E/F,避免重復搜索,

依賴沖突
但是假如 2 個包同時依賴了同一個 jar 包,但是這個 jar 包版本不同,規則是什么樣的呢?比如下圖 A 通過 B 和 D 引入了 1.0 版本的 E,同時 A 通過 C 引入了 2.0 版本的 E,針對這種多個版本構建依賴時,Maven 采用「短路徑優先」原則,即 A 會依賴 2.0 版本的 E,如果想引入 1.0 版本的 E,需要直接在 A 的 pom 中宣告 E 的版本,

如果 Java 專案過于龐大,或者依賴傳遞過于復雜時,可以使用 dependencyManagement 定義默認的版本號,一次定義全域生效,避免開發者自行管理依賴的版本,
依賴回圈
比如:A 依賴了 B,同時 B 又依賴了 A,這種回圈依賴可能不會直接顯現,但是可能會在一個很長的呼叫關系顯現出來,也可能是模塊架構的設計不合理,
我們可以使用 mvn dependency:tree -Dverbose | grep cycle 來判斷專案中是否存在「回圈依賴」,
依賴排除
我們可以使用 exclusion 來解決依賴沖突,但是 exclusion 會降低 Maven 依賴決議的效率,因為對應的 pom 檔案不能快取,每次都要重新遍歷子樹,
對于依賴排除:
exclusion會造成依賴重復掃描和快取,- 在距離根節點越遠的
exclusion,影響的范圍越小, - 依賴樹高度越高,引入
exclusion的代價越大,
依賴分析
IDEA 插件
使用 IDEA 的話,可以在對應專案中右擊,選擇 Diagrams -> Show Dependencies,

Maven 命令列
mvn dependency:tree -Dverbose
公眾號
coding 筆記、點滴記錄,以后的文章也會同步到公眾號(Coding Insight)中,希望大家關注_
代碼和思維導圖在 GitHub 專案中,歡迎大家 star!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/228374.html
標籤:Java
下一篇:思維導圖學《JVM 虛擬機規范》
