精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

實際上手體驗maven面對沖突Jar包的加載規則

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-08-08 11:22 ? 次閱讀

一、問題背景

相信大家在日常的開發過程中都遇到過Jar包沖突的問題,emm,在最近處理業務需求時我也遇到了不同版本jar包沖突導致項目加載出錯的問題。主要是一個完整的項目會不可避免的使用第三方的Jar包來實現功能開發,各種第三方包之間可能會存在依賴關系,不同版本的依賴就會可能導致依賴間的相互沖突,進而導致整個項目加載的失敗。

這篇文章主要記錄了本次遇到的問題:即maven在面對不同版本的jar包在pom文件中同時聲明會存在加載覆蓋的問題,于是通過查詢網上相關資料對maven包的加載規則介紹,并通過實際場景對其進行分析驗證;

二、maven加載原則

1.最短路徑原則:面對多級(兩級及以上)的不同依賴,會優先選擇路徑最短的依賴;

2.聲明優先原則:面對多級(兩級及以上)的同級依賴,先聲明的依賴會覆蓋后聲明的依賴;

3.同級依賴中,后聲明的依賴會覆蓋先聲明的依賴;

三、本地驗證maven加載原則

1.最短路徑原則:使用最短路徑加載的前提是,項目中存在兩級以上的不同依賴jar包,此時項目會優先加載路徑最短的jar包;

wKgaoma0OdWAa8w0AAB2VXgMWjY711.png

?實例驗證:分別在common模塊和service模塊中間接和直接的引入不同版本的elasticsearch-rest-client,觀察項目中面對不同路徑長度情況下實際加載時所使用的版本情況。

?common模塊:common模塊中引入elasticsearch-rest-high-level-client 依賴包, 而該依賴包它引入了 elasticsearch-rest-client 7.4.2,從而實現在common模塊中間接引用該包;

common的pom文件:

    
        
            org.elasticsearch.client
            elasticsearch-rest-high-level-client
            7.4.2
        
    

?service模塊:為了驗證不同路徑長度下maven的包加載順序我們在service模塊中直接引入elasticsearch-rest-client 6.8.13;

service的pom文件:

    
        
            org.elasticsearch.client
            elasticsearch-rest-client
            6.8.13
        
    

?實際加載結果:在IDEA中加載pom文件時,可以在maven管理中看到已經提示jar包沖突;

wKgZoma0OdeAaipNAAW8bQ33M9M375.png

?mvn dependency:tree: 我們可以通過mvn dependency :tree命令來查看該項目的依賴樹,觀察發現實際加載的版本是elasticsearch-rest-client 6.8.13,符合maven中的最短路徑優先原則;

wKgZoma0Od2AFGFbAAJd1U1NqLU170.png

?

2. 聲明優先原則:聲明優先原則的前提是對于兩級以上的同級依賴,先聲明的依賴會覆蓋后聲明的依賴包;

wKgaoma0Od6AVfGcAAB3NKraoWo129.png

?實例驗證:針對該原則的驗證場景構造不再關注模塊是否直接或者間接引用不同版本的es,我們在common模塊和service模塊中都直接引用不同版本的es,然后通過改變兩個模塊在pom文件中聲明的先后順序來觀察項目啟動后實際加載的jar包;

?common模塊:在common模塊中直接引入依賴包elasticsearch-rest-client 7.4.2

    
        
            org.elasticsearch.client
            elasticsearch-rest-client
            7.4.2
        
    

?service模塊:在service模塊中引入依賴包elasticsearch-rest-client 6.8.13

    
        
            org.elasticsearch.client
            elasticsearch-rest-client
            6.8.13
        
    

?實際加載結果:

?場景1:我們將common模塊在pom文件中先引入,然后將在service模塊置于common模塊后面引入,觀察項目實際加載情況;

    
        
            org.example
            backend_common
            1.0-SNAPSHOT
        

        
            org.example
            backend_service
            1.0-SNAPSHOT
        
    

?觀察加載結果圖,發現實際加載的是es-rest-client 7.4.2, 即確實是common模塊聲明生效,service模塊后聲明導致其中的es未被加載。符合聲明優先原則;

wKgZoma0Od-ADU6WAAMw7NdHJbc182.png

?場景2:我們將service模塊在pom文件中先引入,然后將在common模塊置于service模塊后面引入,觀察項目實際加載情況;;

    
         
            org.example
            backend_service
            1.0-SNAPSHOT
        
        
            org.example
            backend_common
            1.0-SNAPSHOT
        
    

?觀察項目實際加載結果圖,發現實際加載的是es-rest-client 6.8.13, 即確實是模塊聲明生效,common模塊后聲明導致其中的es未被加載。發現符合聲明優先原則;

wKgaoma0OeGAQ3kUAANB3XZ-BcI040.png

?聲明優先原則場景驗證結束

3. 同級依賴中后加載覆蓋先加載原則

wKgZoma0OeKAKD6AAABcOAb-VQo519.png

?實例驗證:為了構造在同級依賴中的加載場景我們在項目中直接引入兩個不同es版本的依賴,然后同樣通過改變兩個es版本在pom中的聲明順序來觀察項目實際加載的es版本。

?場景1:我們首先驗證client 7.4.2依賴包在client 6.8.13之前聲明的情況;

    
        
            org.elasticsearch.client
            elasticsearch-rest-client
            7.4.2
        

        
            org.elasticsearch.client
            elasticsearch-rest-client
            6.8.13
        
    

?觀察maven的實際加載結果如下,發現項目中實際加載的es-rest-client 版本是6.8.13,先聲明的7.4.2版本并未實際加載到項目中。符合同級依賴中后加載覆蓋先加載原則。

wKgaoma0OeOAPsuUAAJzDPHmeVs054.png

?場景2:然后我們改變聲明順序,將client 6.8.13依賴包在client 7.4.2之前聲明;

    
        
            org.elasticsearch.client
            elasticsearch-rest-client
            6.8.13
        

        
            org.elasticsearch.client
            elasticsearch-rest-client
            7.4.2
        
    

?觀察maven實際加載結果如下,發現項目中實際加載的es-rest-client 版本是7.4.2,先聲明的6.8.13版本并未實際加載到項目中。符合同級依賴中后加載覆蓋先加載原則。

wKgZoma0OeSAXPFEAAJ3w85KXR0524.png

四、常見異常

Jar發生沖突后在程序啟動時常見異常報錯,下面四種異常是能夠直觀表征Jar包加載沖突

?程序拋出java.lang.ClassNotFoundException異常;

?程序拋出java.lang.NoSuchMethodError異常;

?程序拋出java.lang.NoClassDefFoundError異常;

?程序拋出java.lang.LinkageError異常等;

五、總結

之前只是淺層的了解maven包的加載,沒有結合具體的加載原則進行系統的學習驗證,正好通過需求開發中遇到依賴沖突相關問題對maven的加載原則進行探究。ok,明白啦!

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • maven
    +關注

    關注

    0

    文章

    30

    瀏覽量

    3698
收藏 人收藏

    評論

    相關推薦

    springboot的項目如何既要用jar啟動,同時還可以為不同的機房設置不同的配置文件

    作者:京東科技 李意文 1、首先先把配置文件從jar中抽離 示例代碼: ? org.apache.maven.plugins maven-jar-plugin 3.2.0
    的頭像 發表于 10-19 16:48 ?398次閱讀
    springboot的項目如何既要用<b class='flag-5'>jar</b><b class='flag-5'>包</b>啟動,同時還可以為不同的機房設置不同的配置文件

    PLC的IP沖突如何解決(NAt物聯網解決方案)

    他網絡設備之間的通信將受到嚴重影響,可能出現數據丟、通信延遲甚至通信中斷等問題。 制造商在設備出廠中會將設備IP設置為相同,在接入工廠局域網時便可能與網絡中已存在的設備IP沖突;同時動態分配IP的方式也有可能導致多個設備分配到相同的IP地
    的頭像 發表于 09-06 10:53 ?496次閱讀
    PLC的IP<b class='flag-5'>沖突</b>如何解決(NAt物聯網解決方案)

    AD9元器件間距規則如何設置

    其他潛在問題。以下是設置元器件間距規則的步驟: 一、打開規則設置 啟動AD9 :首先,打開Altium Designer 9軟件,并加載你的PCB設計文件。 訪問規則設置 :在菜單欄中
    的頭像 發表于 09-02 15:26 ?2651次閱讀

    使用Nexus在本地搭建npm、yum和maven私有倉庫

    使用Nexus在本地搭建npm、yum和maven私有倉庫 為保證在無互聯網的情況下,可正常搭建、構建項目,并自動化部署項目,本系統采用Nexus+Jenkins+Maven+Gitlab開源組件
    的頭像 發表于 08-21 14:46 ?244次閱讀
    使用Nexus在本地搭建npm、yum和<b class='flag-5'>maven</b>私有倉庫

    IP地址沖突解決方法圖示

    你是否在日常使用網絡時,有這樣的經歷:突然就失去網絡連接,時斷時續,加載緩慢,文件傳輸突然中斷?網絡連接并沒有完全斷開,但網速變得異常緩慢看電視劇卡頓、下載文件簡直龜速?那么你可能是IP地址沖突
    的頭像 發表于 07-26 11:51 ?399次閱讀

    ESP32S3設置輸出IO的高低電平后,緊接著去讀取電平實際上是沒有變化的,為什么?

    設置輸出IO的高低電平后,緊接著去讀取電平實際上是沒有變化的,跑的是例程呀,只是加了兩個printf,是哪里出問題了呢
    發表于 06-07 06:37

    庫克稱中國內地iPhone業務實際上實現增長

    蘋果公司首席執行官蒂姆·庫克(Tim Cook)近日表示,盡管大中華區截至3月份財季的整體收入有所下滑,但中國內地市場的iPhone業務實際上實現了增長,且降幅低于預期。這一積極信號顯示了中國市場對于蘋果產品的強勁需求。
    的頭像 發表于 05-09 09:40 ?292次閱讀

    云服務器的maven怎么配置本地倉庫?

    在云服務器上使用Maven時,你可以配置本地倉庫以緩存和管理依賴項,以減少對中央倉庫的依賴和加快構建過程。以下是配置Maven本地倉庫的步驟: 1、選擇本地倉庫路徑: 在云服務器上選擇一個適當的目錄
    的頭像 發表于 02-22 16:59 ?483次閱讀

    如何優化 PCB 布線規則

    本文要點在PCB布線中不使用規則可能會出現的問題。設計中可使用的不同類型PCB布線規則。如何在PCB布線中應用規則和約束。“限制”一詞通常具有負面色彩,會引起人們的警惕。但實際上,對于
    的頭像 發表于 02-19 13:00 ?1167次閱讀
    如何優化 PCB 布線<b class='flag-5'>規則</b>?

    一臺高壓電機額定功率5100KW,那它實際上能輸出多少功率?

    一臺高壓電機額定功率5100KW,那它實際上能輸出多少功率? 輸出功率也就是有功功率,這個應該跟功率因數有關。 那它最大輸出功率也不會超出5100KW,它的總功率也就是5100KW. 我如果讓電機
    發表于 12-27 07:22

    SpringBoot項目Jar加密防止反編譯方案

    最近項目要求部署到其他公司的服務器上,但是又不想將源碼泄露出去。要求對正式環境的啟動進行安全性處理,防止客戶直接通過反編譯工具將代碼反編譯出來。
    的頭像 發表于 12-12 14:04 ?1248次閱讀
    SpringBoot項目<b class='flag-5'>Jar</b><b class='flag-5'>包</b>加密防止反編譯方案

    發生IP沖突的原因是什么呢?如何解決IP沖突的問題呢?

    發生IP沖突的原因是什么呢?如何解決IP沖突的問題呢? IP地址沖突是指在一個局域網中兩個或多個設備被分配了相同的IP地址,這會導致網絡通信中斷或無法正常進行。下面將詳細介紹IP沖突
    的頭像 發表于 12-07 09:32 ?4540次閱讀

    idea如何添加maven

    Maven是一個開源的項目管理工具,它提供了一種簡單的方式來管理項目的依賴關系、構建過程和發布部署。本文將詳細介紹如何將Maven添加到你的項目中,并使用它來管理你的項目。 第一步:安裝Maven
    的頭像 發表于 12-06 14:56 ?1157次閱讀

    idea中maven無法解析插件是怎么回事

    Maven是一個軟件項目管理和理解工具,它使用一個項目對象模型(POM)文件來描述項目的結構和依賴關系。Maven的目標是簡化項目的構建過程,提高開發人員的效率。 在Maven的項目構建過程中,插件
    的頭像 發表于 12-06 14:18 ?5872次閱讀

    idea配置了maven但不顯示pom

    配置 Maven 是一個開發者常見的任務,通過 Maven 可以更方便地管理項目依賴和構建過程。在配置 Maven 的過程中,我們可能會遇到一些問題,比如沒有正確顯示 pom 文件。本文將詳細介紹
    的頭像 發表于 12-06 14:17 ?2909次閱讀