欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

maven依賴沖突加載順序與解決

 更新時間:2024年01月22日 08:39:01   作者:街一角  
這篇文章主要介紹了項目中同時引用了相同依賴的不同版本,也就是沖突,maven?是如何選擇的,了解了有助于解決項目中的依賴問題,需要的朋友可以參考下

依賴沖突加載順序

介紹了項目中同時引用了相同依賴的不同版本,也就是沖突,maven 是如何選擇的。了解了有助于解決項目中的依賴問題

先說結(jié)論:

  • 直接依賴的會引用后申明的依賴
  • 間接依賴使用路徑長度最短的,如果長度一樣,則優(yōu)先申明的最終加載
  • 有父 pom 的子 pom 中的會覆蓋父 pom 的依賴版本
  • <dependencyManagement> 管理的版本,子模塊 pom 中間接依賴的版本也被鎖死

優(yōu)先級(運行子 pom):
<dependencyManagement> > 子 pom(直接依賴) > 父 pom > 間接依賴

直接依賴

        <!-- 直接依賴 -->
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.19.4</version>
        </dependency>

項目的 pom 文件直接引用依賴
結(jié)論:maven 會引用后申明的依賴

  • 這種情況幾乎不會有,誰會在一處同時申明2個相同依賴不同版本的依賴,假使出現(xiàn)了,了解即可。

間接依賴

假設(shè) module-starter 的 pom 如下:

        <dependency>
            <groupId>com.meizi</groupId>
            <artifactId>module4</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.meizi</groupId>
            <artifactId>module1</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

module4 引用 protobuf-java:3.11.4

module1 引用 protobuf-java:2.2.0

最終使用的是 protobuf-java:3.11.4

結(jié)論:間接依賴使用優(yōu)先申明的

假設(shè) module-starter 的 pom 如下:

        <dependency>
            <groupId>com.meizi</groupId>
            <artifactId>module2</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.meizi</groupId>
            <artifactId>module4</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

module4 引用 protobuf-java:3.11.4 (路徑長度1)

module2 引用 module3 引用 protobuf-java:3.19.4(路徑長度2)

最終使用的是 protobuf-java:3.11.4

結(jié)論:間接依賴使用路徑長度最短的,如果長度一樣,則優(yōu)先申明的最終加載

父 pom 中的依賴

父 pom 如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.meizi</groupId>
    <artifactId>learnmaven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>module1</module>
        <module>module2</module>
        <module>module3</module>
        <module>module4</module>
        <module>module-starter</module>
    </modules>

    <dependencies>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.11.4</version>
        </dependency>
    </dependencies>

</project>

module1 pom 如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>learnmaven</artifactId>
        <groupId>com.meizi</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>module1</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>2.2.0</version>
        </dependency>

    </dependencies>

</project>

結(jié)論:子 pom 中的會覆蓋父 pom 的依賴版本

  • 如果間接依賴和父 pom 中的依賴出現(xiàn),以父 pom 優(yōu)先

版本鎖定 <dependencyManagement>

  • 使用
    如下在父 pom 申明:

    <!-- learnmaven 父pom-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>2.2.0</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

子模塊 pom 可不用寫版本
子模塊中與 dependencyManagement 匹配的最小信息集是這四個 {groupId, artifactId, type, classifier},因為在大多數(shù)情況下都是 type=jar classifier=null,所以如果不寫,maven默認,如果不是jar的需要指定。

        <!-- module-starter 子pom-->
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
        </dependency>

子模塊 pom 中間接依賴的版本也被鎖死

        <!-- module-starter 子pom-->
        <dependency>
            <groupId>com.meizi</groupId>
            <artifactId>module4</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.meizi</groupId>
            <artifactId>module3</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

  • 從可傳播依賴并入的依賴的版本也受此限制。

依賴沖突解決

了解了依賴沖突加載順序,一定程度上可以解決沖突。 由于沒有依賴傳播級數(shù)的限制,會有可能出現(xiàn)循環(huán)依賴。 所以有一些方式來限制依賴傳播

依賴調(diào)解(最短路徑)

最短路徑 項目的依賴樹最近的依賴
如下依賴:

  A
  ├── B
  │   └── C
  │       └── D 2.0
  └── E
      └── D 1.0

會使用 D 1.0,因為他的路徑最短,如果你想使用 D 2.0 可以在 A 項目中直接添加 D 2.0 依賴,如下

  A
  ├── B
  │   └── C
  │       └── D 2.0
  ├── E
  │   └── D 1.0
  │
  └── D 2.0 

版本鎖定

<dependencyManagement>,使用見上文

依賴作用域

<scope> 作用域,限制依賴傳遞和決定何時依賴包含在類路徑中

提供如下選項:

  • compile 默認,編譯依賴項在項目的所有類路徑中都可用。此外,這些依賴關(guān)系被傳播到依賴的項目。
  • runtime 在編譯中不需要,在執(zhí)行中需要
  • test 表明該依賴在正常使用中不是必須的,并且僅在測試編譯和執(zhí)行階段可用,這個作用域不是可傳遞的
  • system 除了您必須提供顯式包含它的JAR之外,此作用域與提供的作用域類似。工件總是可用的,不會在存儲庫中查找。
  • provided 類似compile,表明這個依賴是提供的,在運行時會有外部提供(例如tomcat),僅在編譯和測試,是不可傳遞的
  • import 只用在pom的 <dependencyManagement> 部分,它指示該依賴項將被指定POM的<dependencyManagement>部分中的有效依賴項列表所替換。

排除依賴

通過使用 exclusion 可以將不需要的依賴排除掉

        <dependency>
            <groupId>com.meizi</groupId>
            <artifactId>module4</artifactId>
            <version>1.0-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.protobuf</groupId>
                    <artifactId>protobuf-java</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

此時,引入module4,將不會引入 protobuf-java。

可選依賴

即 <optional>,默認false不可選,可傳播; true 可選,可認為是被排除了,不可傳播

        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.11.4</version>
            <!-- 默認false不可選,可傳播; true 可選,可認為是被排除了,不可傳播 -->
            <optional>true</optional>
        </dependency>

如果想排除此依賴,也可將 optional 設(shè)置為 true

依賴管理

導(dǎo)入依賴

在大型項目中,很難通過繼承管理所有依賴,因為 maven 是單繼承的。
為了解決這個,項目可以從其他項目導(dǎo)入。通過申明一個 type 是 pom,scope 是 import 的工件

        <!-- learnmaven 父pom-->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-bom</artifactId>
                    <version>4.1.29.Final</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>

所有 netty-bom 中 dependencyManagement 所管理的都會被合并過來。

        <!-- learnmaven 父pom-->
        <dependencyManagement>
            <dependencies>

                <dependency>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-bom</artifactId>
                    <version>4.1.79.Final</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>

                <dependency>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-bom</artifactId>
                    <version>4.1.29.Final</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>

如上,4.1.79.Final 將被使用,因為他先申明
并且導(dǎo)入是遞歸的,例如,netty-bom 導(dǎo)入了另一個 pom,那么這個項目也會導(dǎo)入

到此這篇關(guān)于maven依賴沖突加載順序與解決的文章就介紹到這了,更多相關(guān)maven依賴沖突內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java訪問Hadoop分布式文件系統(tǒng)HDFS的配置說明

    Java訪問Hadoop分布式文件系統(tǒng)HDFS的配置說明

    Hadoop的能提供高吞吐量的數(shù)據(jù)訪問,是集群式服務(wù)器的上的數(shù)據(jù)操作利器,這里就來為大家分享Java訪問Hadoop分布式文件系統(tǒng)HDFS的配置說明:
    2016-06-06
  • java?啟動參數(shù)?springboot?idea詳解

    java?啟動參數(shù)?springboot?idea詳解

    這篇文章主要介紹了java?啟動參數(shù)?springboot?idea的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • MyBatis入門介紹(超簡單)

    MyBatis入門介紹(超簡單)

    mybatis是Java的持久層框架, JAVA操作數(shù)據(jù)庫是通過jdbc來操作的,而mybatis是對jdbc的封裝。下文給大家介紹mybatis入門知識,感興趣的朋友參考下吧
    2017-08-08
  • 關(guān)于mybatis的一級緩存和二級緩存的那些事兒

    關(guān)于mybatis的一級緩存和二級緩存的那些事兒

    MyBatis自帶的緩存有一級緩存和二級緩存,今天我們就來學(xué)習(xí)一下,文中有非常詳細的總結(jié),對正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • IDEA的常見的設(shè)置和優(yōu)化功能圖文詳解

    IDEA的常見的設(shè)置和優(yōu)化功能圖文詳解

    這篇文章主要介紹了IDEA的常見的設(shè)置和優(yōu)化功能,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 命令行編譯java文件方式

    命令行編譯java文件方式

    這篇文章主要介紹了命令行編譯java文件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • SpringBoot+jpa配置如何根據(jù)實體類自動創(chuàng)建表

    SpringBoot+jpa配置如何根據(jù)實體類自動創(chuàng)建表

    這篇文章主要介紹了SpringBoot+jpa配置如何根據(jù)實體類自動創(chuàng)建表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Jenkins初級使用過程中的異常處理

    Jenkins初級使用過程中的異常處理

    這篇文章主要為大家介紹了Jenkins初級使用過程中的異常處理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • IDEA切換JDK版本詳細教程(超管用)

    IDEA切換JDK版本詳細教程(超管用)

    在我們項目開發(fā)的過程中可能會遇到JDK版本過高或者過低導(dǎo)致一些程序無法啟動,不兼容的問題,所以我們需要切換JDK的版本號,這篇文章主要給大家介紹了關(guān)于IDEA切換JDK版本的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • Netty分布式抽象編碼器MessageToByteEncoder邏輯分析

    Netty分布式抽象編碼器MessageToByteEncoder邏輯分析

    這篇文章主要介紹了Netty分布式抽象編碼器MessageToByteEncoder的抽象邏輯分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03

最新評論