本篇主要來看看 maven 對於 重複依賴的jar的不同版本時候 它內部的選擇規則, 很多時候我們在搭建環境的時候 不注意就會存在依賴衝突等問題 那依賴衝突的時候 為什麼maven選擇了不是你如你所想的jar 版本呢 , 其實都是有一定規則的 下面來看看吧
我們在使用maven 的時候 多多少少遇到過jar包衝突的問題, 在對一個jar包引入不同版本後,可能會導致NoSuchMethodError 錯誤, 那麼你真的清楚 maven 在多個版本jar的時候是怎麼去選擇版本的呢? 如果理解這些 在加上一些依賴衝突輔助工具,可以讓你更加快速的解決這類問題
先把重複依賴後 選擇原則丟擲來 待會一個個進行驗證
建立 web , service , common 模組
使用 elasticsearch-rest-high-level-client 和 elasticsearch-rest-client 配合 演示
最短路徑原則的前提是 兩級以上的不同級依賴, 選擇路徑最短
common 模組中引入了 elasticsearch-rest-high-level-client 7.4.2 而它依賴了 elasticsearch-rest-client 7.4.2
common pom
:
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.2</version>
</dependency>
</dependencies>
service 模組中 直接引入了 elasticsearch-rest-client 6.8.13
service pom
:
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>6.8.13</version>
</dependency>
</dependencies>
開啟idea 的maven 部分可以看到 已經提示我們 有依賴衝突了, 其實它標註在 common模組中的下 就表示這個衝突了 不使用它
可以通過 mvn dependency:tree 去檢視 專案的依賴樹 , 可以看到 最短路徑原則 生效了, maven 選擇了短路徑的 service模組的 elasticsearch-rest-client:6.8.13 版本
宣告優先原則: 前提是 兩級以上的同級依賴, 先宣告的覆蓋後宣告的
把上面的依賴結構改一下
讓common 模組直接依賴 elasticsearch-rest-client 7.4.2
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.4.2</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>6.8.13</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>backend_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>backend_service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
記得需要重新打包模組 mvn clean install
由於 依賴順序 common 在 service 之前 選擇了 common 中的依賴
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>backend_service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>backend_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
記得需要重新打包模組 mvn clean install
由於 依賴順序 service 在 common 之前 選擇了 service 中的依賴
至此宣告優先原則 驗證完畢
將依賴改成如下
在web 的pom 中 直接引入2個 版本的依賴
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.4.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>6.8.13</version>
</dependency>
</dependencies>
記得需要重新打包模組 mvn clean install
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>6.8.13</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.4.2</version>
</dependency>
</dependencies>
記得需要重新打包模組 mvn clean install
最後 推薦一款 idea 中 可以分析快速解決 maven 依賴衝突的 外掛 maven helper
下面依賴標註的 6.8.13 也表示了 當前maven 選擇的 jar 版本
本篇非常詳細了介紹了 maven 中當有重複依賴不同版本jar 的時候 maven 選擇jar的 幾個規則,並且都一一做了 驗證, 你學會了嗎, maven 平時我們都是隻是 複製貼上用一用 但是當你遇到問題的時候 需要快速解決它的能力,加油吧!
歡迎大家存取 個人部落格 Johnny小屋
歡迎關注個人公眾號