maven 重復依賴不同版本 選擇規則

maven 重復依賴不同版本 選擇規則

本篇主要來看看 maven 對于 重復依賴的jar的不同版本時候 它內部的選擇規則, 很多時候我們在搭建環境的時候 不注意就會存在依賴沖突等問題 那依賴沖突的時候 為什么maven選擇了不是你如你所想的jar 版本呢 , 其實都是有一定規則的 下面來看看吧
1.前言我們在使用maven 的時候 多多少少遇到過jar包沖突的問題, 在對一個jar包引入不同版本后,可能會導致NoSuchMethodError 錯誤, 那么你真的清楚 maven 在多個版本jar的時候是怎么去選擇版本的呢? 如果理解這些 在加上一些依賴沖突輔助工具,可以讓你更加快速的解決這類問題
2.重復依賴選擇原則先把重復依賴后 選擇原則拋出來 待會一個個進行驗證
  • 最短路徑原則:兩級以上的不同級依賴, 選擇路徑最短
  • 聲明優先原則 :兩級以上的同級依賴,先聲明的覆蓋后聲明的
  • 同級依賴后加載覆蓋先加載原則
3.前置準備
  • 創建web , service ,common 模塊
  • 使用 elasticsearch-rest-high-level-client 和 elasticsearch-rest-client 配合 演示
    maven 重復依賴不同版本 選擇規則

    文章插圖
4.最短路徑原則最短路徑原則的前提是 兩級以上的不同級依賴, 選擇路徑最短
maven 重復依賴不同版本 選擇規則

文章插圖
4.1 common 模塊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>4.2 service 模塊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>4.3 idea maven 分析工具打開idea 的maven 部分可以看到 已經提示我們 有依賴沖突了, 其實它標注在 common模塊中的下 就表示這個沖突了 不使用它
maven 重復依賴不同版本 選擇規則

文章插圖
4.4 mvn dependency:tree可以通過 mvn dependency:tree 去查看 項目的依賴樹 , 可以看到 最短路徑原則 生效了, maven 選擇了短路徑的 service模塊的 elasticsearch-rest-client:6.8.13 版本
maven 重復依賴不同版本 選擇規則

文章插圖
5.聲明優先原則聲明優先原則:前提是 兩級以上的同級依賴, 先聲明的覆蓋后聲明的
把上面的依賴結構改一下
maven 重復依賴不同版本 選擇規則

文章插圖
5.1 common 模塊讓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>5.2 service 模塊<dependencies><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>6.8.13</version></dependency></dependencies>5.3 驗證 web 模塊 (common 在 service 前)<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 中的依賴
maven 重復依賴不同版本 選擇規則

文章插圖
5.4 驗證 web 模塊 (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 中的依賴

推薦閱讀