亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

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

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

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

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

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-08-08 11:22 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、問題背景

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

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

二、maven加載原則

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

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

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

三、本地驗證maven加載原則

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

wKgaoma0OdWAa8w0AAB2VXgMWjY711.png

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

?common模塊:common模塊中引入elasticsearch-rest-high-level-client 依賴包, 而該依賴包它引入了 elasticsearch-rest-client 7.4.2,從而實現(xiàn)在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
        
    

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

wKgZoma0OdeAaipNAAW8bQ33M9M375.png

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

wKgZoma0Od2AFGFbAAJd1U1NqLU170.png

?

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

wKgaoma0Od6AVfGcAAB3NKraoWo129.png

?實例驗證:針對該原則的驗證場景構(gòu)造不再關(guān)注模塊是否直接或者間接引用不同版本的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
        
    

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

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

    
        
            org.example
            backend_common
            1.0-SNAPSHOT
        

        
            org.example
            backend_service
            1.0-SNAPSHOT
        
    

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

wKgZoma0Od-ADU6WAAMw7NdHJbc182.png

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

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

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

wKgaoma0OeGAQ3kUAANB3XZ-BcI040.png

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

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

wKgZoma0OeKAKD6AAABcOAb-VQo519.png

?實例驗證:為了構(gòu)造在同級依賴中的加載場景,我們在項目中直接引入兩個不同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的實際加載結(jié)果如下,發(fā)現(xiàn)項目中實際加載的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實際加載結(jié)果如下,發(fā)現(xiàn)項目中實際加載的es-rest-client 版本是7.4.2,先聲明的6.8.13版本并未實際加載到項目中。符合同級依賴中后加載覆蓋先加載原則。

wKgZoma0OeSAXPFEAAJ3w85KXR0524.png

四、常見異常

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

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

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

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

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

五、總結(jié)

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

審核編輯 黃宇

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

    關(guān)注

    0

    文章

    30

    瀏覽量

    3982
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    RTthread怎么加載zynq的支持

    RTthread有xilinx zynq的芯片支持包了么,SDK管理器里面怎么下載ZYNQ的支持呢?求助
    發(fā)表于 09-23 06:05

    如何解決RT-Thread 編譯沖突,DIR 類型在 ff.h 與 dirent.h 中重復(fù)定義?

    軟件時,編譯出現(xiàn)如下沖突: 具體是: dfs/elmfat/ff.h 中定義了 FatFS 的 DIR 結(jié)構(gòu)體 libc/dirent.h 中也定義了 POSIX 的 DIR 結(jié)構(gòu)體 導(dǎo)致沖突編譯
    發(fā)表于 09-16 06:16

    編程軟件連接PLC出現(xiàn)IP沖突時如何解決?

    一般來說,每個PLC都有自己的IP地址,用以和其他設(shè)備進(jìn)行通信。而如果同一網(wǎng)絡(luò)出現(xiàn)相同IP的設(shè)備,就會導(dǎo)致IP沖突、數(shù)據(jù)丟或ping不通等問題。而如果IP地址沒有沖突,不在一個網(wǎng)段內(nèi)的設(shè)備也是無法
    的頭像 發(fā)表于 07-31 17:08 ?706次閱讀
    編程軟件連接PLC出現(xiàn)IP<b class='flag-5'>沖突</b>時如何解決?

    CNC的IP地址相同沖突如何解決?

    的IP地址,這就極易引發(fā)IP地址沖突問題。當(dāng)這些設(shè)備接入車間網(wǎng)絡(luò)時,IP沖突會導(dǎo)致數(shù)據(jù)采集不上來,物聯(lián)網(wǎng)平臺缺乏數(shù)據(jù)來源,嚴(yán)重影響數(shù)字化車間的建設(shè)。 通常,設(shè)備被設(shè)置相同IP地址,是廠家在出廠前方便質(zhì)檢與測試,這種做法在單機(jī)
    的頭像 發(fā)表于 07-23 14:13 ?360次閱讀
    CNC的IP地址相同<b class='flag-5'>沖突</b>如何解決?

    CC\\-Link IE轉(zhuǎn)Modbus TCP:風(fēng)電設(shè)備通信的“雙語模式”

    、波特率及映射規(guī)則即可。 案例:風(fēng)電場的實際問題與解決 問題描述:某風(fēng)電項目中,風(fēng)機(jī)變流器(Modbus TCP)需將實時功率數(shù)據(jù)(1秒/次)上傳至基于CC-Link IE的中控系統(tǒng)。初期測試發(fā)現(xiàn)
    發(fā)表于 07-07 14:45

    ArkUI-X通過Stage模型開發(fā)Android端應(yīng)用指南(一)

    arkui_android_adapter.jar所提供的StageApplication。StageApplication用于初始化資源路徑以及加載配置信息,例如: package
    發(fā)表于 06-24 22:16

    鴻蒙5開發(fā)寶藏案例分享---優(yōu)化應(yīng)用體積大小問題

    ;gt; 代碼,內(nèi)重復(fù)。 ? HSP動態(tài) :所有HAP共享同一份HSP代碼,物理存儲僅1份。效果 :資源越多,節(jié)省越顯著(尤其圖片、公共組件庫)。 ?3. OHPM依賴沖突解決:告別重復(fù)編譯
    發(fā)表于 06-13 10:09

    業(yè)務(wù)監(jiān)控—一站式搭建jmeter+telegraf+influxdb+Grafana看板

    一、前言 當(dāng)前所測試業(yè)務(wù)需求為集成在業(yè)務(wù)系統(tǒng)WMS的jar,jar測試主要集中在本地拉取開發(fā)編寫的代碼做單元測試,因為jar
    的頭像 發(fā)表于 05-27 14:40 ?1008次閱讀
    業(yè)務(wù)監(jiān)控—一站式搭建jmeter+telegraf+influxdb+Grafana看板

    HarmonyOS優(yōu)化應(yīng)用體積大小問題性能優(yōu)化

    和資源,消除使用HAR靜態(tài)共享造成的多(HAP、HSP)間代碼和資源的重復(fù)拷貝,從而減小應(yīng)用大小。 使用ohpm的override機(jī)制或者開啟resolve_conflict解決依賴沖突
    發(fā)表于 05-20 14:50

    TwinCAT3 EtherCAT抓 | 技術(shù)集結(jié)

    在使用TwinCAT測試EtherCATEOE功能時,我們會發(fā)現(xiàn)正常是無法使用Wireshark去進(jìn)行網(wǎng)絡(luò)抓抓取EtherCAT報文的,今天這篇文章就帶大家來上手EtherCAT抓方式。準(zhǔn)備環(huán)境
    的頭像 發(fā)表于 05-15 18:04 ?4643次閱讀
    TwinCAT3 EtherCAT抓<b class='flag-5'>包</b> | 技術(shù)集結(jié)

    Venue快速上手指南

    電子發(fā)燒友網(wǎng)站提供《Venue快速上手指南.pdf》資料免費下載
    發(fā)表于 03-26 14:34 ?0次下載

    工業(yè)數(shù)據(jù)采集如何避免IP沖突問題

    擴(kuò)展或老舊設(shè)備接入時,重復(fù)沖突的IP地址會導(dǎo)致通信網(wǎng)絡(luò)通信混亂、數(shù)據(jù)丟、通信延遲甚至中斷,嚴(yán)重影響數(shù)據(jù)采集的實時性和準(zhǔn)確性。 為此,采用有效的技術(shù)手段避免IP沖突顯得尤為重要,物通博聯(lián)推出基于網(wǎng)段隔離器(NAT網(wǎng)關(guān))
    的頭像 發(fā)表于 03-06 10:12 ?568次閱讀

    Stellaris引導(dǎo)加載程序用戶指南

    電子發(fā)燒友網(wǎng)站提供《Stellaris引導(dǎo)加載程序用戶指南.pdf》資料免費下載
    發(fā)表于 12-23 16:24 ?0次下載
    Stellaris引導(dǎo)<b class='flag-5'>加載</b>程序用戶指南

    NAT網(wǎng)關(guān)實現(xiàn)工業(yè)設(shè)備組網(wǎng)監(jiān)控,解決網(wǎng)段沖突問題

    在制造業(yè)工廠中,存在大量部署好的生產(chǎn)網(wǎng)絡(luò)、工作網(wǎng)絡(luò)等網(wǎng)絡(luò)環(huán)境,通常本地化建設(shè),在面對新的設(shè)備接入或集團(tuán)信息化改造時,十分容易發(fā)生IP地址段沖突的問題,導(dǎo)致設(shè)備無法通信,信息化平臺得不到數(shù)據(jù)支持
    的頭像 發(fā)表于 12-05 13:48 ?877次閱讀
    NAT網(wǎng)關(guān)實現(xiàn)工業(yè)設(shè)備組網(wǎng)監(jiān)控,解決網(wǎng)段<b class='flag-5'>沖突</b>問題

    PyTorch 數(shù)據(jù)加載與處理方法

    PyTorch 是一個流行的開源機(jī)器學(xué)習(xí)庫,它提供了強(qiáng)大的工具來構(gòu)建和訓(xùn)練深度學(xué)習(xí)模型。在構(gòu)建模型之前,一個重要的步驟是加載和處理數(shù)據(jù)。 1. PyTorch 數(shù)據(jù)加載基礎(chǔ) 在 PyTorch 中
    的頭像 發(fā)表于 11-05 17:37 ?1248次閱讀