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 配合 演示

    image-20221025151502857

4.最短路徑原則

最短路徑原則的前提是 兩級以上的不同級依賴, 選擇路徑最短

image-20221025154328799

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模塊中的下 就表示這個衝突了 不使用它

image-20221025152057576

4.4 mvn dependency:tree

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

image-20221025152506714

5.聲明優先原則

聲明優先原則: 前提是 兩級以上的同級依賴, 先聲明的覆蓋後聲明的

把上面的依賴結構改一下

image-20221025154359655

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 中的依賴

image-20221025153845751

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 中的依賴

image-20221025154129495

至此聲明優先原則 驗證完畢

6.同級依賴後加載 覆蓋 先加載原則

將依賴改成如下

image-20221025154440302

6.1 web 模塊

在web 的pom 中 直接引入2個 版本的依賴

6.2 驗證 web模塊(client 7.4.2 在 client 6.8.13 前)

    <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

image-20221025154741418

6.3 驗證 web模塊(client 6.8.13 在 client 7.4.2 前)

    <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

image-20221025154957696

7. idea 插件 maven helper

最後 推薦一款 idea 中 可以分析快速解決 maven 依賴衝突的 插件 maven helper

image-20221025155159667

下面依賴標註的 6.8.13 也表示了 當前maven 選擇的 jar 版本

image-20221025155429247

總結

本篇非常詳細了介紹了 maven 中當有重複依賴不同版本jar 的時候 maven 選擇jar的 幾個規則,並且都一一做了 驗證, 你學會了嗎, maven 平時我們都是隻是 複製粘貼用一用 但是當你遇到問題的時候 需要快速解決它的能力,加油吧!

歡迎大家訪問 個人博客 Johnny小屋
歡迎關注個人公衆號

歡迎關注個人公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章