Maven 依賴樹的解析規則

對於 Java 開發工程師來講,Maven 是依賴管理和代碼構建的標準。遵循「約定大於配置」理念。Maven 是 Java 開發工程師平常使用的工具,本篇文章簡要介紹一下 Maven 的依賴樹解析。git

依賴樹結構

在 pom.xml 的 dependencies 中聲明依賴包後,Maven 將直接引入依賴,並經過解析直接依賴的 pom.xml 將傳遞性依賴導入到當前項目,最終造成一個樹狀的依賴結構。github

原則:深度優先遍歷依賴,並緩存節點剪枝。好比下圖:緩存

  • 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 的版本。app

若是 Java 項目過於龐大,或者依賴傳遞過於複雜時,可使用 dependencyManagement 定義默認的版本號,一次定義全局生效,避免開發者自行管理依賴的版本。工具

依賴循環

好比:A 依賴了 B,同時 B 又依賴了 A。這種循環依賴可能不會直接顯現,可是可能會在一個很長的調用關係顯現出來,也多是模塊架構的設計不合理。spa

咱們可使用 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!

相關文章
相關標籤/搜索