0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

實(shí)際上手體驗(yàn)maven面對(duì)沖突Jar包的加載規(guī)則

京東云 ? 來(lái)源:jf_75140285 ? 作者:jf_75140285 ? 2024-08-08 11:22 ? 次閱讀

一、問(wèn)題背景

相信大家在日常的開發(fā)過(guò)程中都遇到過(guò)Jar包沖突的問(wèn)題,emm,在最近處理業(yè)務(wù)需求時(shí)我也遇到了不同版本jar包沖突導(dǎo)致項(xiàng)目加載出錯(cuò)的問(wèn)題。主要是一個(gè)完整的項(xiàng)目會(huì)不可避免的使用第三方的Jar包來(lái)實(shí)現(xiàn)功能開發(fā),各種第三方包之間可能會(huì)存在依賴關(guān)系,不同版本的依賴就會(huì)可能導(dǎo)致依賴間的相互沖突,進(jìn)而導(dǎo)致整個(gè)項(xiàng)目加載的失敗。

這篇文章主要記錄了本次遇到的問(wèn)題:即maven在面對(duì)不同版本的jar包在pom文件中同時(shí)聲明會(huì)存在加載覆蓋的問(wèn)題,于是通過(guò)查詢網(wǎng)上相關(guān)資料對(duì)maven包的加載規(guī)則介紹,并通過(guò)實(shí)際場(chǎng)景對(duì)其進(jìn)行分析驗(yàn)證;

二、maven加載原則

1.最短路徑原則:面對(duì)多級(jí)(兩級(jí)及以上)的不同依賴,會(huì)優(yōu)先選擇路徑最短的依賴;

2.聲明優(yōu)先原則:面對(duì)多級(jí)(兩級(jí)及以上)的同級(jí)依賴,先聲明的依賴會(huì)覆蓋后聲明的依賴;

3.同級(jí)依賴中,后聲明的依賴會(huì)覆蓋先聲明的依賴;

三、本地驗(yàn)證maven加載原則

1.最短路徑原則:使用最短路徑加載的前提是,項(xiàng)目中存在兩級(jí)以上的不同依賴jar包,此時(shí)項(xiàng)目會(huì)優(yōu)先加載路徑最短的jar包;

wKgaoma0OdWAa8w0AAB2VXgMWjY711.png

?實(shí)例驗(yàn)證:分別在common模塊和service模塊中間接和直接的引入不同版本的elasticsearch-rest-client,觀察項(xiàng)目中面對(duì)不同路徑長(zhǎng)度情況下實(shí)際加載時(shí)所使用的版本情況。

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

common的pom文件:

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

?service模塊:為了驗(yàn)證不同路徑長(zhǎng)度下maven的包加載順序,我們?cè)?strong>service模塊中直接引入elasticsearch-rest-client 6.8.13;

service的pom文件:

    
        
            org.elasticsearch.client
            elasticsearch-rest-client
            6.8.13
        
    

?實(shí)際加載結(jié)果:在IDEA中加載pom文件時(shí),可以在maven管理中看到已經(jīng)提示jar包沖突;

wKgZoma0OdeAaipNAAW8bQ33M9M375.png

?mvn dependency:tree: 我們可以通過(guò)mvn dependency :tree命令來(lái)查看該項(xiàng)目的依賴樹,觀察發(fā)現(xiàn)實(shí)際加載的版本是elasticsearch-rest-client 6.8.13,符合maven中的最短路徑優(yōu)先原則;

wKgZoma0Od2AFGFbAAJd1U1NqLU170.png

?

2. 聲明優(yōu)先原則:聲明優(yōu)先原則的前提是對(duì)于兩級(jí)以上的同級(jí)依賴,先聲明的依賴會(huì)覆蓋后聲明的依賴包;

wKgaoma0Od6AVfGcAAB3NKraoWo129.png

?實(shí)例驗(yàn)證:針對(duì)該原則的驗(yàn)證場(chǎng)景構(gòu)造不再關(guān)注模塊是否直接或者間接引用不同版本的es,我們?cè)赾ommon模塊和service模塊中都直接引用不同版本的es,然后通過(guò)改變兩個(gè)模塊在pom文件中聲明的先后順序來(lái)觀察項(xiàng)目啟動(dòng)后實(shí)際加載的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
        
    

?實(shí)際加載結(jié)果:

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

    
        
            org.example
            backend_common
            1.0-SNAPSHOT
        

        
            org.example
            backend_service
            1.0-SNAPSHOT
        
    

?觀察加載結(jié)果圖,發(fā)現(xiàn)實(shí)際加載的是es-rest-client 7.4.2, 即確實(shí)是common模塊聲明生效,service模塊后聲明導(dǎo)致其中的es未被加載。符合聲明優(yōu)先原則;

wKgZoma0Od-ADU6WAAMw7NdHJbc182.png

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

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

?觀察項(xiàng)目實(shí)際加載結(jié)果圖,發(fā)現(xiàn)實(shí)際加載的是es-rest-client 6.8.13, 即確實(shí)是模塊聲明生效,common模塊后聲明導(dǎo)致其中的es未被加載。發(fā)現(xiàn)符合聲明優(yōu)先原則;

wKgaoma0OeGAQ3kUAANB3XZ-BcI040.png

?聲明優(yōu)先原則場(chǎng)景驗(yàn)證結(jié)束;

3. 同級(jí)依賴中后加載覆蓋先加載原則;

wKgZoma0OeKAKD6AAABcOAb-VQo519.png

?實(shí)例驗(yàn)證:為了構(gòu)造在同級(jí)依賴中的加載場(chǎng)景我們?cè)陧?xiàng)目中直接引入兩個(gè)不同es版本的依賴,然后同樣通過(guò)改變兩個(gè)es版本在pom中的聲明順序來(lái)觀察項(xiàng)目實(shí)際加載的es版本。

?場(chǎng)景1:我們首先驗(yàn)證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的實(shí)際加載結(jié)果如下,發(fā)現(xiàn)項(xiàng)目中實(shí)際加載的es-rest-client 版本是6.8.13,先聲明的7.4.2版本并未實(shí)際加載到項(xiàng)目中。符合同級(jí)依賴中后加載覆蓋先加載原則。

wKgaoma0OeOAPsuUAAJzDPHmeVs054.png

?場(chǎng)景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實(shí)際加載結(jié)果如下,發(fā)現(xiàn)項(xiàng)目中實(shí)際加載的es-rest-client 版本是7.4.2,先聲明的6.8.13版本并未實(shí)際加載到項(xiàng)目中。符合同級(jí)依賴中后加載覆蓋先加載原則。

wKgZoma0OeSAXPFEAAJ3w85KXR0524.png

四、常見異常

Jar發(fā)生沖突后在程序啟動(dòng)時(shí)常見異常報(bào)錯(cuò),下面四種異常是能夠直觀表征Jar包加載沖突

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

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

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

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

五、總結(jié)

之前只是淺層的了解maven包的加載,沒(méi)有結(jié)合具體的加載原則進(jìn)行系統(tǒng)的學(xué)習(xí)驗(yàn)證,正好通過(guò)需求開發(fā)中遇到依賴沖突相關(guān)問(wèn)題對(duì)maven的加載原則進(jìn)行探究。ok,明白啦!

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • maven
    +關(guān)注

    關(guān)注

    0

    文章

    30

    瀏覽量

    3693
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    springboot的項(xiàng)目如何既要用jar啟動(dòng),同時(shí)還可以為不同的機(jī)房設(shè)置不同的配置文件

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

    AD9元器件間距規(guī)則如何設(shè)置

    其他潛在問(wèn)題。以下是設(shè)置元器件間距規(guī)則的步驟: 一、打開規(guī)則設(shè)置 啟動(dòng)AD9 :首先,打開Altium Designer 9軟件,并加載你的PCB設(shè)計(jì)文件。 訪問(wèn)規(guī)則設(shè)置 :在菜單欄中
    的頭像 發(fā)表于 09-02 15:26 ?1718次閱讀

    使用Nexus在本地搭建npm、yum和maven私有倉(cāng)庫(kù)

    使用Nexus在本地搭建npm、yum和maven私有倉(cāng)庫(kù) 為保證在無(wú)互聯(lián)網(wǎng)的情況下,可正常搭建、構(gòu)建項(xiàng)目,并自動(dòng)化部署項(xiàng)目,本系統(tǒng)采用Nexus+Jenkins+Maven+Gitlab開源組件
    的頭像 發(fā)表于 08-21 14:46 ?215次閱讀
    使用Nexus在本地搭建npm、yum和<b class='flag-5'>maven</b>私有倉(cāng)庫(kù)

    IP地址沖突解決方法圖示

    你是否在日常使用網(wǎng)絡(luò)時(shí),有這樣的經(jīng)歷:突然就失去網(wǎng)絡(luò)連接,時(shí)斷時(shí)續(xù),加載緩慢,文件傳輸突然中斷?網(wǎng)絡(luò)連接并沒(méi)有完全斷開,但網(wǎng)速變得異常緩慢看電視劇卡頓、下載文件簡(jiǎn)直龜速?那么你可能是IP地址沖突
    的頭像 發(fā)表于 07-26 11:51 ?345次閱讀

    庫(kù)克稱中國(guó)內(nèi)地iPhone業(yè)務(wù)實(shí)際上實(shí)現(xiàn)增長(zhǎng)

    蘋果公司首席執(zhí)行官蒂姆·庫(kù)克(Tim Cook)近日表示,盡管大中華區(qū)截至3月份財(cái)季的整體收入有所下滑,但中國(guó)內(nèi)地市場(chǎng)的iPhone業(yè)務(wù)實(shí)際上實(shí)現(xiàn)了增長(zhǎng),且降幅低于預(yù)期。這一積極信號(hào)顯示了中國(guó)市場(chǎng)對(duì)于蘋果產(chǎn)品的強(qiáng)勁需求。
    的頭像 發(fā)表于 05-09 09:40 ?262次閱讀

    云服務(wù)器的maven怎么配置本地倉(cāng)庫(kù)?

    在云服務(wù)器上使用Maven時(shí),你可以配置本地倉(cāng)庫(kù)以緩存和管理依賴項(xiàng),以減少對(duì)中央倉(cāng)庫(kù)的依賴和加快構(gòu)建過(guò)程。以下是配置Maven本地倉(cāng)庫(kù)的步驟: 1、選擇本地倉(cāng)庫(kù)路徑: 在云服務(wù)器上選擇一個(gè)適當(dāng)?shù)哪夸?/div>
    的頭像 發(fā)表于 02-22 16:59 ?448次閱讀

    如何優(yōu)化 PCB 布線規(guī)則?

    本文要點(diǎn)在PCB布線中不使用規(guī)則可能會(huì)出現(xiàn)的問(wèn)題。設(shè)計(jì)中可使用的不同類型PCB布線規(guī)則。如何在PCB布線中應(yīng)用規(guī)則和約束?!跋拗啤币辉~通常具有負(fù)面色彩,會(huì)引起人們的警惕。但實(shí)際上,對(duì)于
    的頭像 發(fā)表于 02-19 13:00 ?1091次閱讀
    如何優(yōu)化 PCB 布線<b class='flag-5'>規(guī)則</b>?

    SpringBoot項(xiàng)目Jar加密防止反編譯方案

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

    發(fā)生IP沖突的原因是什么呢?如何解決IP沖突的問(wèn)題呢?

    發(fā)生IP沖突的原因是什么呢?如何解決IP沖突的問(wèn)題呢? IP地址沖突是指在一個(gè)局域網(wǎng)中兩個(gè)或多個(gè)設(shè)備被分配了相同的IP地址,這會(huì)導(dǎo)致網(wǎng)絡(luò)通信中斷或無(wú)法正常進(jìn)行。下面將詳細(xì)介紹IP沖突
    的頭像 發(fā)表于 12-07 09:32 ?4364次閱讀

    idea如何添加maven

    Maven是一個(gè)開源的項(xiàng)目管理工具,它提供了一種簡(jiǎn)單的方式來(lái)管理項(xiàng)目的依賴關(guān)系、構(gòu)建過(guò)程和發(fā)布部署。本文將詳細(xì)介紹如何將Maven添加到你的項(xiàng)目中,并使用它來(lái)管理你的項(xiàng)目。 第一步:安裝Maven
    的頭像 發(fā)表于 12-06 14:56 ?1078次閱讀

    idea中maven無(wú)法解析插件是怎么回事

    Maven是一個(gè)軟件項(xiàng)目管理和理解工具,它使用一個(gè)項(xiàng)目對(duì)象模型(POM)文件來(lái)描述項(xiàng)目的結(jié)構(gòu)和依賴關(guān)系。Maven的目標(biāo)是簡(jiǎn)化項(xiàng)目的構(gòu)建過(guò)程,提高開發(fā)人員的效率。 在Maven的項(xiàng)目構(gòu)建過(guò)程中,插件
    的頭像 發(fā)表于 12-06 14:18 ?5563次閱讀

    idea配置了maven但不顯示pom

    配置 Maven 是一個(gè)開發(fā)者常見的任務(wù),通過(guò) Maven 可以更方便地管理項(xiàng)目依賴和構(gòu)建過(guò)程。在配置 Maven 的過(guò)程中,我們可能會(huì)遇到一些問(wèn)題,比如沒(méi)有正確顯示 pom 文件。本文將詳細(xì)介紹
    的頭像 發(fā)表于 12-06 14:17 ?2531次閱讀

    java導(dǎo)入import怎么寫

    的名稱。 Java中的(package)是一種將相關(guān)的類組織在一起的機(jī)制。的主要目的是避免類名沖突,并提供類的管理機(jī)制。通過(guò)使用,我們可
    的頭像 發(fā)表于 11-22 15:00 ?876次閱讀

    IC設(shè)計(jì):常見的ram訪問(wèn)沖突

    ram沖突是幾乎每顆芯片都需要關(guān)注的問(wèn)題,部分場(chǎng)景下,ram訪問(wèn)沖突不容易驗(yàn)證到,容易造成芯片bug。ram訪問(wèn)沖突的類型通常有訪問(wèn)接口沖突和訪問(wèn)地址
    的頭像 發(fā)表于 11-13 10:44 ?1539次閱讀
    IC設(shè)計(jì):常見的ram訪問(wèn)<b class='flag-5'>沖突</b>

    RT1052 分散加載問(wèn)題

    我在分散加載中是這樣配置的: 目的是把代碼拆開,存儲(chǔ)在flash的不同扇區(qū)。 但我發(fā)現(xiàn)上電后函數(shù)RunPro的代碼沒(méi)有從nor flash成功加載到SDRAM,所以單片機(jī)運(yùn)行到函數(shù)RunPro就死機(jī)
    發(fā)表于 11-08 18:40