對於 Java 開發工程師來講,Maven 是依賴管理和代碼構建的標準。遵循「約定大於配置」理念。Maven 是 Java 開發工程師平常使用的工具,本篇文章簡要介紹一下 Maven 的依賴樹解析。git
在 pom.xml 的 dependencies 中聲明依賴包後,Maven 將直接引入依賴,並經過解析直接依賴的 pom.xml 將傳遞性依賴導入到當前項目,最終造成一個樹狀的依賴結構。github
原則:深度優先遍歷依賴,並緩存節點剪枝。好比下圖:緩存
在第二步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 的話,能夠在對應項目中右擊,選擇 Diagrams -> Show Dependencies。
mvn dependency:tree -Dverbose
coding 筆記、點滴記錄,之後的文章也會同步到公衆號(Coding Insight)中,但願你們關注^_^
代碼和思惟導圖在 GitHub 項目中,歡迎你們 star!