精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從Jar包沖突搞到類加載機制,就是這么霸氣

開發 項目管理
對于純手動添加jar包的項目已經是多年前的方式了,現在工作三五年的技術人員可能都沒有經歷過。就是把項目中所需的jar包挨個找出來,添加到一個lib目錄中,在IDE中再將jar包依賴手動添加上。

[[427166]]

背景

目前市面上項目管理要么是基于Maven,要么是基于Gradle,最近接手了一套純手動添加jar包的項目。

對于純手動添加jar包的項目已經是多年前的方式了,現在工作三五年的技術人員可能都沒有經歷過。就是把項目中所需的jar包挨個找出來,添加到一個lib目錄中,在IDE中再將jar包依賴手動添加上。

這種方式來添加jar包依賴,不僅費事,而且很容易出現jar包沖突,同時分析沖突手段,只能憑借經驗。

最近就遇到這樣一種情況:一個項目在開發者A的環境中可以正常啟動,在B那里就無法啟動,而異常信息是找不到什么什么類。

稍微有一些開發經驗的人,馬上就可以斷定是jar包沖突導致。下面就看看如何解決及引申出來的知識點。

臨時解決方案

由于暫時無法對項目進行大范圍重構,也不敢輕易將Jar包進行替換升級。只能采用臨時的手段來進行解決。

這里總結幾個步驟以備不時之需,通常也是解決Jar依賴問題的小技巧。

第一:在IDE中查找異常中找不到的類。比如IDEA MAC操作系統,我用的快捷鍵是command + shift + n。

查找沖突

以Assert類為例,可以看到有很多包都包含了Assert,但啟動程序卻報找不到該類的某個方法,問題基本上就出在Jar包沖突上了。

第二,定位到Jar包沖突之后,找到系統本應該使用的Jar包。

比如這里需要使用的spring-core中的類,而不spring.jar中的類。那么,就可以利用JVM的類加載順序機制,讓JVM先加載spring-core的jar包。

知識點:在同一目錄下的jar包,JVM是按照jar包的先后順序進行加載,一旦一個全路徑名相同的類被加載之后,后面再有相同的類便不會進行加載了。

因此,臨時解決方案就是調整JVM編譯(加載)Jar包的順序。這個在Eclipse和Idea中都有支持,可以手動進行調整。

Eclipse中調整方式:

Eclipse調整順序

Idea中調整方式:

Idea調整順序

把需要優先加載的jar包往上調整,這樣就可以優先加載它,總算是臨時解決了jar包沖突的問題。

類加載機制的延伸

上面只是受限于項目現狀的臨時解決方案,最終肯定是要進行改造升級的,基于Maven或Gradle進行Jar包管理,同時解決掉Jar包沖突的問題的。

在這個臨時解決方案,涉及到一個JVM的關鍵知識點:JVM的類加載器的隔離問題及雙親委派機制。如果沒有JVM類加載機制的相關知識,可能連上面的臨時方案都無法想到。

類加載器的隔離問題

每個類裝載器都有一個自己的命名空間用來保存已裝載的類。當一個類裝載器裝載一個類時,它會通過保存在命名空間里的類全局限定名(Fully Qualified Class Name) 進行搜索來檢測這個類是否已經被加載了。

JVM 對類唯一的識別是 ClassLoader id + PackageName + ClassName,所以一個運行程序中是有可能存在兩個包名和類名完全一致的類的。并且如果這兩個類不是由一個 ClassLoader 加載,是無法將一個類的實例強轉為另外一個類的,這就是 ClassLoader 隔離性。

為了解決類加載器的隔離問題,JVM引入了雙親委派機制。

雙親委派機制

雙親委派機制的核心有兩點:第一,自底向上檢查類是否已加載;其二,自頂向下嘗試加載類。

類加載器

類加載器通常有四類:啟動類加載器、拓展類加載器、應用程序類加載器和自定義類加載器。

暫且不考慮自定義類加載器,JDK自帶類加載器具體執行過程如下:

第一:當AppClassLoader加載一個class時,會把類加載請求委派給父類加載器ExtClassLoader去完成;

第二:當ExtClassLoader加載一個class時,會把類加載請求委派給BootStrapClassLoader去完成;

第三:如果BootStrapClassLoader加載失敗(例如在%JAVA_HOME%/jre/lib里未查找到該class),會使用ExtClassLoader來嘗試加載;

第四:如果ExtClassLoader也加載失敗,則會使用AppClassLoader來加載,如果AppClassLoader也加載失敗,則會報出異常ClassNotFoundException。

ClassLoader的雙親委派實現

ClassLoader通過loadClass()方法實現了雙親委托機制,用于類的動態加載。

該方法的源碼如下:

  1. protected Class<?> loadClass(String name, boolean resolve) 
  2.         throws ClassNotFoundException{ 
  3.         synchronized (getClassLoadingLock(name)) { 
  4.             // Firstcheck if the class has already been loaded 
  5.             Class<?> c = findLoadedClass(name); 
  6.             if (c == null) { 
  7.                 long t0 = System.nanoTime(); 
  8.                 try { 
  9.                     if (parent != null) { 
  10.                         c = parent.loadClass(namefalse); 
  11.                     } else { 
  12.                         c = findBootstrapClassOrNull(name); 
  13.                     } 
  14.                 } catch (ClassNotFoundException e) { 
  15.                     // ClassNotFoundException thrown if class not found 
  16.                     // from the non-null parent class loader 
  17.                 } 
  18.  
  19.                 if (c == null) { 
  20.                     // If still not found, then invoke findClass in order 
  21.                     // to find the class. 
  22.                     long t1 = System.nanoTime(); 
  23.                     c = findClass(name); 
  24.  
  25.                     // this is the defining class loader; record the stats 
  26.                     sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0); 
  27.                     sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); 
  28.                     sun.misc.PerfCounter.getFindClasses().increment(); 
  29.                 } 
  30.             } 
  31.             if (resolve) { 
  32.                 resolveClass(c); 
  33.             } 
  34.             return c; 
  35.         } 
  36.     } 

loadClass方法本身是一個遞歸向上調用的過程,上述代碼中從parent.loadClass的調用就可以看出。

在執行其他操作之前,首先通過findLoadedClass方法從最底端的類加載器開始檢查是否已經加載指定的類。如果已經加載,則根據resolve參數決定是否要執行連接過程,并返回Class對象。

而Jar包沖突往往發生在這里,當第一個同名的類被加載之后,在這一步檢查時就會直接返回,不會再加載真正需要的類。那么,程序用到該類時就會拋出找不到類,或找不到類方法的異常。

Jar包的加載順序

上面已經看到一旦一個類被加載之后,全局限定名相同的類可能就無法被加載了。而Jar包被加載的順序直接決定了類加載的順序。

決定Jar包加載順序通常有以下因素:

  • 第一,Jar包所處的加載路徑。也就是加載該Jar包的類加載器在JVM類加載器樹結構中所處層級。上面講到的四類類加載器加載的Jar包的路徑是有不同的優先級的。
  • 第二,文件系統的文件加載順序。因Tomcat、Resin等容器的ClassLoader獲取加載路徑下的文件列表時是不排序的,這就依賴于底層文件系統返回的順序,當不同環境之間的文件系統不一致時,就會出現有的環境沒問題,有的環境出現沖突。

本人遇到的問題屬于第二種因素中的一個分支情況,即同一目錄下不同Jar包的加載順序不同。因此,通過調整Jar包的加載順序就暫時解決了問題。

Jar包沖突的通常表現

Jar包沖突往往是很詭異的事情,也很難排查,但也會有一些共性的表現。

拋出java.lang.ClassNotFoundException:典型異常,主要是依賴中沒有該類。導致原因有兩方面:第一,的確沒有引入該類;第二,由于Jar包沖突,Maven仲裁機制選擇了錯誤的版本,導致加載的Jar包中沒有該類。

  • 拋出java.lang.NoSuchMethodError:找不到特定的方法。Jar包沖突,導致選擇了錯誤的依賴版本,該依賴版本中的類對不存在該方法,或該方法已經被升級。
  • 拋出java.lang.NoClassDefFoundError,java.lang.LinkageError等,原因同上。
  • 沒有異常但預期結果不同:加載了錯誤的版本,不同的版本底層實現不同,導致預期結果不一致。

Tomcat啟動時Jar包和類的加載順序

最后,梳理一下Tomcat啟動時,對Jar包和類的加載順序,其中包含上面提到的不同種類的類加載器默認加載的目錄:

  • $java_home/lib 目錄下的java核心api;
  • $java_home/lib/ext 目錄下的java擴展jar包;
  • java -classpath/-Djava.class.path所指的目錄下的類與jar包;
  • $CATALINA_HOME/common目錄下按照文件夾的順序從上往下依次加載;
  • $CATALINA_HOME/server目錄下按照文件夾的順序從上往下依次加載;
  • $CATALINA_BASE/shared目錄下按照文件夾的順序從上往下依次加載;
  • 項目路徑/WEB-INF/classes下的class文件;
  • 項目路徑/WEB-INF/lib下的jar文件;

上述目錄中,同一文件夾下的Jar包,按照順序從上到下一次加載。如果一個class文件已經被加載到JVM中,后面相同的class文件就不會被加載了。

小結

Jar包沖突在我們的日常開發中是非常常見的問題,如果能夠很好理解沖突的原因及底層機制,可以極大的提高解決問題的能力和團隊影響力。因此,在不少面試中都會被提及此類問題。

 

這篇文章我們重點講了手動添加依賴情況下導致Jar包沖突的原因及解決方案。在解決該問題時往往還會設計到Maven對Jar包沖突管理的一些策略,比如依賴傳遞原則、最短路徑優先原則、最先聲明原則等,我們下篇文章再來詳細聊聊。

 

責任編輯:武曉燕 來源: 程序新視界
相關推薦

2014-12-04 10:30:04

Java

2021-02-26 10:21:35

比特幣投資金融

2021-07-05 06:51:43

Java機制類加載器

2023-10-31 16:00:51

類加載機制Java

2021-06-02 06:01:31

Java擴展Jar包

2022-10-26 08:16:58

jar包依賴關系Maven

2024-09-06 09:37:45

WebApp類加載器Web 應用

2015-09-10 14:40:32

大數據神奇

2015-06-09 15:26:51

未來的媒體華為

2021-01-06 09:01:05

javaclass

2010-07-08 15:38:57

機房散熱

2021-01-15 08:37:28

JAR加載

2019-12-01 22:08:04

Mavenjar包開發

2024-09-04 09:47:21

2014-12-09 13:06:30

華為移動公交

2021-05-24 10:50:10

Git命令Linux

2017-11-28 15:29:04

iPhone X網頁適配

2024-03-12 07:44:53

JVM雙親委托機制類加載器

2025-07-01 07:41:37

Java類加載器雙親委派

2019-12-26 09:50:14

HTTP緩存代理服務器
點贊
收藏

51CTO技術棧公眾號

国产亚洲精品成人av久久ww| 欧美日韩亚洲高清| 国产精品传媒毛片三区| 毛片视频网站在线观看| 国产黄在线看| 韩国欧美国产1区| 久久久久久网站| 少妇视频在线播放| 国偷自产视频一区二区久| 在线观看91视频| 青青青在线视频播放| 国产黄色免费在线观看| 成人午夜激情片| 国产精品一区二区久久国产| 香蕉视频一区二区| 国产精品亚洲综合在线观看| 亚洲高清视频的网址| 亚洲va韩国va欧美va精四季| 刘亦菲毛片一区二区三区| 日韩激情视频在线观看| 午夜精品久久久久久久99热浪潮| 亚洲欧美一区二区三区不卡| 成人影院大全| 久久众筹精品私拍模特| 成人网在线免费观看| 天堂网中文字幕| 亚洲无线一线二线三线区别av| 中文字幕日韩综合av| 泷泽萝拉在线播放| 欧美xo影院| 亚洲一区二区精品视频| 亚洲一区二区三区加勒比| 欧美日本网站| 91视频你懂的| 国产综合av一区二区三区| 男女视频免费看| 亚洲va久久| 欧美精品一区二区三区蜜臀| 无码中文字幕色专区| 污的网站在线观看| 亚洲天堂av老司机| 综合视频免费看| 3d成人动漫在线| 日本一区二区三区四区在线视频| 欧美日韩一区二区三区在线视频 | 蜜桃视频在线观看www社区 | 国产1区2区3区在线| 94色蜜桃网一区二区三区| 欧洲日本亚洲国产区| 久久久无码精品亚洲国产| 91欧美国产| 久久综合久中文字幕青草| 欧美黄色aaa| 欧美黄色aaaa| 国产午夜精品久久久| 天天干天天操天天做| 精品三区视频| 欧美日韩在线播放| www.男人天堂网| 肉肉视频在线观看| 亚洲一区中文在线| 欧美深夜福利视频| 欧美黑人一区| 欧美视频一区二| 在线一区二区不卡| 一区二区三区视频播放| 亚洲精品国产免费| 人人妻人人澡人人爽人人精品| 制服丝袜日韩| 色妞欧美日韩在线| 久久久久人妻一区精品色欧美| 欧美日韩国产亚洲一区| 91国产视频在线| 国产免费一级视频| 亚洲国产三级| 欧美一级淫片aaaaaaa视频| www.久久久久久久| 九九国产精品视频| 精品久久久久亚洲| 国产乱子伦三级在线播放| 国产精品久久久久精k8| 老司机激情视频| 国产免费不卡| 9191精品国产综合久久久久久 | av不卡在线播放| 欧美精品一区二区三区在线看午夜| 欧美精品a∨在线观看不卡| 国产精品午夜春色av| 国产精品国产三级国产专区53| 日本国产在线观看| 欧美国产一区在线| 日本黄色片一级片| 666av成人影院在线观看| 在线不卡免费av| 强迫凌虐淫辱の牝奴在线观看| 国产欧美一区| 九九久久久久久久久激情| 日日噜噜噜噜人人爽亚洲精品| 久久精品99久久久| 精品视频高清无人区区二区三区| 日本美女在线中文版| 亚洲成人午夜电影| 涩多多在线观看| 免费久久精品| 欧美成人在线影院| 欧美国产一级片| 成人免费视频免费观看| 亚洲精品tv久久久久久久久| av漫画网站在线观看| 欧美久久高跟鞋激| 日韩一区二区a片免费观看| 91精品国产乱码久久久久久久| 538国产精品视频一区二区| 国产精品欧美亚洲| 国产欧美精品一区二区色综合| 人妻av中文系列| 久久久91麻豆精品国产一区| 亚洲图片欧美午夜| 青青草av在线播放| 国产91高潮流白浆在线麻豆| 高清av免费一区中文字幕| 大胆av不用播放器在线播放| 无吗不卡中文字幕| 亚洲一区二区三区黄色| 亚洲自拍偷拍网| 国产在线高清精品| yw在线观看| 色先锋资源久久综合| 成人性生活免费看| 久久93精品国产91久久综合| 欧美激情欧美狂野欧美精品 | 精品一区二区久久久| 日韩不卡av| 国产精品av一区二区三区 | 成年网站在线| 色偷偷成人一区二区三区91| 好吊色视频一区二区三区| 海角社区69精品视频| 91av一区二区三区| 伊人影院蕉久影院在线播放| 777a∨成人精品桃花网| 情侣偷拍对白清晰饥渴难耐| 美美哒免费高清在线观看视频一区二区| 奇米精品在线| 国产日产一区二区| 欧美日韩午夜精品| 少妇视频一区二区| 精品一区二区三区免费观看| 制服诱惑一区| 二区三区精品| 精品自拍视频在线观看| www.成人免费视频| 亚洲成av人影院| 无码一区二区精品| 免费在线日韩av| 欧美一区二区福利| 成人免费毛片嘿嘿连载视频…| 一区二区三区黄色| 亚洲综合视频在线播放| 亚洲欧美日韩国产综合| 中文字幕欧美视频| 亚洲国产清纯| 日产精品久久久一区二区| 欧美天堂一区二区| 欧美日韩国产成人高清视频| 狠狠人妻久久久久久综合麻豆| 亚洲va韩国va欧美va精品| 日本黄色网址大全| 蜜臀av一级做a爰片久久| 国产成年人在线观看| 中文字幕在线官网| 一级做a爰片久久毛片美女图片| 中日韩av在线| 亚洲欧美福利一区二区| www.四虎在线| 亚洲尤物在线| 中文字幕一区二区中文字幕 | 久久久久一区二区三区| 欧洲精品一区二区三区| 久久人人爽亚洲精品天堂| 粉嫩av一区二区夜夜嗨| 色香蕉久久蜜桃| 中文字幕五月天| 91视频国产观看| 91制片厂毛片| 亚洲调教视频在线观看| 欧美自拍资源在线| 亚洲国产一区二区三区网站| 全球成人中文在线| 老司机免费在线视频| 亚洲国产成人精品一区二区| 波多野结衣视频网址| 一区二区三区免费在线观看| 性欧美13一14内谢| 国产传媒一区在线| 99草草国产熟女视频在线| 国产精品jizz在线观看美国| 日本成人黄色免费看| 日韩高清在线观看一区二区| 国产成人亚洲综合| 国产一线二线在线观看 | 国产又黄又粗视频| www.亚洲免费av| 亚洲精品mv在线观看| 久久精品道一区二区三区| 成人毛片100部免费看| 九九热线有精品视频99| 国产精品免费一区二区三区观看| 韩日精品一区二区| 国内伊人久久久久久网站视频 | 国产精品99视频| 久久riav| 国产厕拍一区| 亚洲一区二区在线| 色多多视频在线观看| 亚洲精品美女网站| 亚洲av无码乱码在线观看性色 | 黄色片免费在线观看视频| 国产成人手机高清在线观看网站| 国产激情一区二区三区在线观看| 亚洲成人高清| 国产精品久久999| 男女羞羞在线观看| 亚洲欧美日韩在线高清直播| 亚洲精品福利网站| 日韩一区二区三区免费看| 亚洲综合精品国产一区二区三区| 色综合夜色一区| 四虎成人永久免费视频| 亚洲第一精品在线| 久久久香蕉视频| 亚洲综合在线视频| 538精品在线视频| 亚洲人成影院在线观看| 三级黄色录像视频| 国产精品毛片久久久久久| 欧美黄色激情视频| 久久综合久久综合久久综合| a级一a一级在线观看| 不卡的av电影在线观看| 制服丝袜在线第一页| 风间由美一区二区三区在线观看| 1314成人网| 国产精品系列在线观看| 男生和女生一起差差差视频| 亚洲美女91| 真人抽搐一进一出视频| 最新日韩在线| 国产 福利 在线| 老**午夜毛片一区二区三区| 国产视频一区二区三区在线播放| 日韩高清在线电影| 一个色综合久久| 国产精品资源在线观看| 国产精久久久久| 不卡视频一二三四| 丰满少妇在线观看资源站| 久久精品夜色噜噜亚洲aⅴ| 欧美丰满老妇熟乱xxxxyyy| 亚洲欧洲国产日本综合| 卡通动漫亚洲综合| 亚洲电影第三页| 黄色av一级片| 欧美日韩一区二区三区免费看| 一区二区国产欧美| 日韩精品一区二区三区视频播放| 亚洲精品一区二区三区蜜桃| 亚洲国产另类 国产精品国产免费| 日本大片在线观看| 中文在线资源观看视频网站免费不卡 | 久久99蜜桃精品| 国产九九九视频| 国产精品一区二区在线播放| 国产xxxx视频| 国产欧美日韩一区二区三区在线观看| 日本二区三区视频| 亚洲国产精品久久一线不卡| 精产国品一区二区| 欧美一级二级三级蜜桃| 亚洲av片在线观看| www.欧美免费| av电影在线地址| 国产精品老牛影院在线观看| 日韩成人在线看| 欧美精品中文字幕一区二区| 天天做天天爱天天综合网2021| 99re6这里有精品热视频| 久久久久国产精品一区二区| 毛片毛片毛片毛片毛| 久久久精品免费网站| av激情在线观看| 日本韩国欧美国产| 成人乱码一区二区三区 | 久精品国产欧美| 99久久99久久精品国产片桃花| 国产 日韩 欧美在线| 毛片av一区二区三区| 国产 中文 字幕 日韩 在线| 国产精品不卡在线| 成年免费在线观看| 在线观看91av| 懂色av中文在线| 97香蕉久久夜色精品国产| 欧美97人人模人人爽人人喊视频| 国产精品一区二区你懂得| 性欧美69xoxoxoxo| 熟妇人妻va精品中文字幕| 粉嫩久久99精品久久久久久夜| 极品尤物一区二区| 欧美网站在线观看| 黑人精品一区二区三区| 欧美精品一本久久男人的天堂| 成人自拍视频网| 久久久婷婷一区二区三区不卡| 欧美阿v一级看视频| 中文字幕网av| 国产午夜精品美女毛片视频| www.日本精品| 91精品国产综合久久久久久 | 中文字幕在线不卡国产视频| 日本中文字幕在线| 亚洲国产精品一区二区久| 影音先锋在线视频| 成人欧美一区二区三区在线湿哒哒| 久久最新网址| av免费中文字幕| 91香蕉国产在线观看软件| 99免费在线观看| 日韩一区二区中文字幕| 麻豆视频在线| 国产美女久久久| 欧美先锋资源| www.99av.com| 国产欧美一区二区三区在线看蜜臀| 国产精品久久久久久99| 日韩大陆毛片av| 在线观看涩涩| 欧美精品在线一区| 三级在线观看一区二区 | 色视频精品视频在线观看| 高清欧美性猛交xxxx黑人猛交| 一区三区自拍| 成人一区二区免费视频| 99久久精品国产毛片| 久久精品免费在线| 精品国产免费人成在线观看| 欧美aaa免费| 国产呦系列欧美呦日韩呦| 亚洲国产高清一区二区三区| yy1111111| 色综合久久九月婷婷色综合| 韩国中文字幕2020精品| 国产精品都在这里| 色综合蜜月久久综合网| 国产高清av在线播放| 成人精品视频一区二区三区| 日韩 欧美 亚洲| 亚洲天堂av在线免费| 久久亚洲精品爱爱| 男女爱爱视频网站| 成人免费三级在线| 日日噜噜噜噜人人爽亚洲精品| 中文字幕不卡在线视频极品| 久久免费资源| 97免费视频观看| 久久久久国产精品厨房| 亚洲中文字幕在线观看| 欧美高清第一页| 天海翼亚洲一区二区三区| 亚洲精品一二三四五区| 亚洲视频 欧洲视频| 秋霞欧美在线观看| 日韩av日韩在线观看| 国产精品精品国产一区二区| 在线免费看黄色片| www.日韩一区| 亚洲国产精品yw在线观看| 亚洲女色av| 亚洲一区二区三区欧美| 国产91精品一区二区麻豆网站| 亚洲日本韩国在线| 中文字幕在线日韩| 凹凸av导航大全精品| 青青在线视频免费| 亚洲麻豆国产自偷在线| 免费人成在线观看网站| 成人免费激情视频| 免费日韩av片| 欧美性猛交xxxxx少妇| 日韩高清欧美高清| 精品久久国产一区| 亚洲国产精品久久久久爰色欲| 亚洲欧洲制服丝袜| 日本韩国一区| 91视频免费网站| 久久久精品五月天| 久草视频免费播放| 最新的欧美黄色| 欧美理论电影在线精品| 亚洲精品第三页|