最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

依賴沖突加載順序

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

先說結(jié)論:

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

優(yōu)先級(jí)(運(yùn)行子 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>

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

  • 這種情況幾乎不會(huì)有,誰會(huì)在一處同時(shí)申明2個(gè)相同依賴不同版本的依賴,假使出現(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 (路徑長(zhǎng)度1)

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

最終使用的是 protobuf-java:3.11.4

結(jié)論:間接依賴使用路徑長(zhǎng)度最短的,如果長(zhǎng)度一樣,則優(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 中的會(huì)覆蓋父 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 匹配的最小信息集是這四個(gè) {groupId, artifactId, type, classifier},因?yàn)樵诖蠖鄶?shù)情況下都是 type=jar classifier=null,所以如果不寫,maven默認(rèn),如果不是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>

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

依賴沖突解決

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

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

最短路徑 項(xiàng)目的依賴樹最近的依賴
如下依賴:

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

會(huì)使用 D 1.0,因?yàn)樗穆窂阶疃蹋绻阆胧褂?nbsp;D 2.0 可以在 A 項(xiàng)目中直接添加 D 2.0 依賴,如下

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

版本鎖定

<dependencyManagement>,使用見上文

依賴作用域

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

提供如下選項(xiàng):

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

排除依賴

通過使用 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>

此時(shí),引入module4,將不會(huì)引入 protobuf-java

可選依賴

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

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

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

依賴管理

導(dǎo)入依賴

在大型項(xiàng)目中,很難通過繼承管理所有依賴,因?yàn)?maven 是單繼承的。
為了解決這個(gè),項(xiàng)目可以從其他項(xiàng)目導(dǎo)入。通過申明一個(gè) 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 所管理的都會(huì)被合并過來。

        <!-- 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 將被使用,因?yàn)樗壬昝?br />并且導(dǎo)入是遞歸的,例如,netty-bom 導(dǎo)入了另一個(gè) pom,那么這個(gè)項(xiàng)目也會(huì)導(dǎo)入

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

相關(guān)文章

  • Java通過socket客戶端保持連接服務(wù)端實(shí)現(xiàn)代碼

    Java通過socket客戶端保持連接服務(wù)端實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java通過socket客戶端保持連接服務(wù)端實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot集成PDFBox實(shí)現(xiàn)電子簽章的代碼詳解

    SpringBoot集成PDFBox實(shí)現(xiàn)電子簽章的代碼詳解

    Apache PDFBox 是一個(gè)開源的 Java 庫,用于處理 PDF 文檔,它提供了一系列強(qiáng)大的功能,包括創(chuàng)建、渲染、拆分、合并、加密、解密 PDF 文件,以及從 PDF 中提取文本和元數(shù)據(jù)等,本文給大家介紹了SpringBoot集成PDFBox實(shí)現(xiàn)電子簽章,需要的朋友可以參考下
    2024-09-09
  • Java?Elastic-Job分布式定時(shí)任務(wù)使用方法介紹

    Java?Elastic-Job分布式定時(shí)任務(wù)使用方法介紹

    xxl-job?通過一個(gè)中心式的調(diào)度平臺(tái),調(diào)度多個(gè)執(zhí)行器執(zhí)行任務(wù),調(diào)度中心通過?DB?鎖保證集群分布式調(diào)度的一致性,這樣擴(kuò)展執(zhí)行器會(huì)增大?DB?的壓力,然而大部分公司的任務(wù)數(shù),執(zhí)行器并不多;xxl-job?提供了非常好用的監(jiān)控頁面甚至還有任務(wù)失敗的郵件告警功能
    2023-01-01
  • java協(xié)變返回類型使用示例

    java協(xié)變返回類型使用示例

    在面向?qū)ο蟪绦蛟O(shè)計(jì)中,協(xié)變返回類型指的是子類中的成員函數(shù)的返回值類型不必嚴(yán)格等同于父類中被重寫的成員函數(shù)的返回值類型,而可以是更"狹窄"的類型
    2014-02-02
  • Spring?Boot中記錄用戶系統(tǒng)操作流程

    Spring?Boot中記錄用戶系統(tǒng)操作流程

    這篇文章主要介紹了如何在Spring?Boot中記錄用戶系統(tǒng)操作流程,將介紹如何在Spring?Boot中使用AOP(面向切面編程)和日志框架來實(shí)現(xiàn)用戶系統(tǒng)操作流程的記錄,需要的朋友可以參考下
    2023-07-07
  • java UDP實(shí)現(xiàn)一個(gè)聊天工具的示例代碼

    java UDP實(shí)現(xiàn)一個(gè)聊天工具的示例代碼

    這篇文章主要介紹了java UDP實(shí)現(xiàn)一個(gè)聊天工具的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 高并發(fā)下如何避免重復(fù)數(shù)據(jù)產(chǎn)生技巧

    高并發(fā)下如何避免重復(fù)數(shù)據(jù)產(chǎn)生技巧

    這篇文章主要為大家介紹了高并發(fā)下如何避免重復(fù)數(shù)據(jù)的產(chǎn)生技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • SpringBoot中Mybatis注解一對(duì)多和多對(duì)多查詢實(shí)現(xiàn)示例

    SpringBoot中Mybatis注解一對(duì)多和多對(duì)多查詢實(shí)現(xiàn)示例

    這篇文章主要介紹了SpringBoot中Mybatis注解一對(duì)多和多對(duì)多查詢的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • JAVA異常分類和處理解析

    JAVA異常分類和處理解析

    這篇文章主要介紹了JAVA異常分類和處理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • SpringBoot實(shí)現(xiàn)多環(huán)境配置文件切換

    SpringBoot實(shí)現(xiàn)多環(huán)境配置文件切換

    這篇文章主要為大家詳細(xì)介紹了如何使用SpringBoot實(shí)現(xiàn)多環(huán)境配置文件切換功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-05-05

最新評(píng)論

苗栗县| 金乡县| 东明县| 井研县| 延长县| 南澳县| 喀喇| 禹城市| 县级市| 科尔| 剑川县| 榆林市| 尼勒克县| 扎兰屯市| 襄汾县| 白朗县| 布拖县| 麻栗坡县| 阿拉善盟| 司法| 安岳县| 文昌市| 宁河县| 河南省| 盐池县| 石台县| 时尚| 安远县| 久治县| 枣庄市| 昌宁县| 定襄县| 繁峙县| 鄂托克旗| 洛宁县| 湟中县| 金山区| 苏尼特右旗| 益阳市| 秦安县| 毕节市|