怎么解決java.lang.NoclassDeffFoundError錯(cuò)誤

前言

在日常Java開發(fā)中熔恢,我們經(jīng)常碰到j(luò)ava.lang.NoClassDefFoundError這樣的錯(cuò)誤,需要花費(fèi)很多時(shí)間去找錯(cuò)誤的原因穿铆,具體是哪個(gè)類不見了艺演?類明明還在,為什么找不到贱傀?而且我們很容易把java.lang.NoClassDefFoundError和java.lang.ClassNotfoundException這兩個(gè)錯(cuò)誤搞混惨撇,事實(shí)上這兩個(gè)錯(cuò)誤是完全不同的。我們往往花費(fèi)時(shí)間去不斷嘗試一些其他的方法去解決這個(gè)問題府寒,而沒有真正去理解這個(gè)錯(cuò)誤的原因魁衙。這篇文章就是通過解決NoClassDefFoundError錯(cuò)誤處理的經(jīng)驗(yàn)分享來揭開NoClassDefFoundError的一些秘密报腔。NoClassDefFoundError的錯(cuò)誤并非不能解決或者說很難解決,只是這種錯(cuò)誤的表現(xiàn)形式很容易迷惑其他的Java開發(fā)者剖淀。下面我們來分析下為什么會(huì)發(fā)生NoClassDefFoundError這樣的錯(cuò)誤纯蛾,以及怎樣去解決這個(gè)錯(cuò)誤。

NoClassDefFoundError錯(cuò)誤發(fā)生的原因

NoClassDefFoundError錯(cuò)誤的發(fā)生纵隔,是因?yàn)镴ava虛擬機(jī)在編譯時(shí)能找到合適的類翻诉,而在運(yùn)行時(shí)不能找到合適的類導(dǎo)致的錯(cuò)誤。例如在運(yùn)行時(shí)我們想調(diào)用某個(gè)類的方法或者訪問這個(gè)類的靜態(tài)成員的時(shí)候巨朦,發(fā)現(xiàn)這個(gè)類不可用米丘,此時(shí)Java虛擬機(jī)就會(huì)拋出NoClassDefFoundError錯(cuò)誤。與ClassNotFoundException的不同在于糊啡,這個(gè)錯(cuò)誤發(fā)生只在運(yùn)行時(shí)需要加載對(duì)應(yīng)的類不成功拄查,而不是編譯時(shí)發(fā)生。很多Java開發(fā)者很容易在這里把這兩個(gè)錯(cuò)誤搞混棚蓄。

簡單總結(jié)就是堕扶,NoClassDefFoundError發(fā)生在編譯時(shí)對(duì)應(yīng)的類可用,而運(yùn)行時(shí)在Java的classpath路徑中梭依,對(duì)應(yīng)的類不可用導(dǎo)致的錯(cuò)誤稍算。發(fā)生NoClassDefFoundError錯(cuò)誤時(shí),你能看到如下的錯(cuò)誤日志:

Exception in thread "main" java.lang.NoClassDefFoundError
1
錯(cuò)誤的信息很明顯地指明main線程無法找到指定的類役拴,而這個(gè)main線程可能時(shí)主線程或者其他子線程糊探。如果是主線程發(fā)生錯(cuò)誤,程序?qū)⒈罎⒒蛲V购尤颍绻亲泳€程科平,則子線程停止,其他線程繼續(xù)運(yùn)行姜性。

NoClassDefFoundError和ClassNotFoundException區(qū)別

我們經(jīng)常被java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError這兩個(gè)錯(cuò)誤迷惑不清瞪慧,盡管他們都與Java classpath有關(guān),但是他們完全不同部念。NoClassDefFoundError發(fā)生在JVM在動(dòng)態(tài)運(yùn)行時(shí)弃酌,根據(jù)你提供的類名,在classpath中找到對(duì)應(yīng)的類進(jìn)行加載儡炼,但當(dāng)它找不到這個(gè)類時(shí)妓湘,就發(fā)生了java.lang.NoClassDefFoundError的錯(cuò)誤,而ClassNotFoundException是在編譯的時(shí)候在classpath中找不到對(duì)應(yīng)的類而發(fā)生的錯(cuò)誤乌询。ClassNotFoundException比NoClassDefFoundError容易解決多柑,是因?yàn)樵诰幾g時(shí)我們就知道錯(cuò)誤發(fā)生,并且完全是由于環(huán)境的問題導(dǎo)致楣责。而如果你在J2EE的環(huán)境下工作竣灌,并且得到NoClassDefFoundError的異常聂沙,而且對(duì)應(yīng)的錯(cuò)誤的類是確實(shí)存在的,這說明這個(gè)類對(duì)于類加載器來說初嘹,可能是不可見的及汉。

怎么解決NoClassDefFoundError錯(cuò)誤

根據(jù)前文,很明顯NoClassDefFoundError的錯(cuò)誤是因?yàn)樵谶\(yùn)行時(shí)類加載器在classpath下找不到需要加載的類屯烦,所以我們需要把對(duì)應(yīng)的類加載到classpath中坷随,或者檢查為什么類在classpath中是不可用的,這個(gè)發(fā)生可能的原因如下:

對(duì)應(yīng)的Class在java的classpath中不可用
你可能用jar命令運(yùn)行你的程序驻龟,但類并沒有在jar文件的manifest文件中的classpath屬性中定義
可能程序的啟動(dòng)腳本覆蓋了原來的classpath環(huán)境變量
因?yàn)镹oClassDefFoundError是java.lang.LinkageError的一個(gè)子類温眉,所以可能由于程序依賴的原生的類庫不可用而導(dǎo)致
檢查日志文件中是否有java.lang.ExceptionInInitializerError這樣的錯(cuò)誤,NoClassDefFoundError有可能是由于靜態(tài)初始化失敗導(dǎo)致的
如果你工作在J2EE的環(huán)境翁狐,有多個(gè)不同的類加載器类溢,也可能導(dǎo)致NoClassDefFoundError
下面我們看一些當(dāng)發(fā)生NoClassDefFoundError時(shí),我們?cè)撊绾谓鉀Q的樣例露懒。

NoClassDefFoundError解決示例

當(dāng)發(fā)生由于缺少jar文件闯冷,或者jar文件沒有添加到classpath,或者jar的文件名發(fā)生變更會(huì)導(dǎo)致java.lang.NoClassDefFoundError的錯(cuò)誤懈词。
當(dāng)類不在classpath中時(shí)蛇耀,這種情況很難確切的知道,但如果在程序中打印出System.getproperty(“java.classpath”)坎弯,可以得到程序?qū)嶋H運(yùn)行的classpath
運(yùn)行時(shí)明確指定你認(rèn)為程序能正常運(yùn)行的 -classpath 參數(shù)纺涤,如果增加之后程序能正常運(yùn)行,說明原來程序的classpath被其他人覆蓋了抠忘。
NoClassDefFoundError也可能由于類的靜態(tài)初始化模塊錯(cuò)誤導(dǎo)致撩炊,當(dāng)你的類執(zhí)行一些靜態(tài)初始化模塊操作,如果初始化模塊拋出異常褐桌,哪些依賴這個(gè)類的其他類會(huì)拋出NoClassDefFoundError的錯(cuò)誤。如果你查看程序日志象迎,會(huì)發(fā)現(xiàn)一些java.lang.ExceptionInInitializerError的錯(cuò)誤日志荧嵌,ExceptionInInitializerError的錯(cuò)誤會(huì)導(dǎo)致java.lang.NoClassDefFoundError: Could not initialize class,如下面的代碼示例:
/**

  • Java program to demonstrate how failure of static initialization subsequently cause

  • java.lang.NoClassDefFoundError in Java.

  • @author Javin Paul
    */
    public class NoClassDefFoundErrorDueToStaticInitFailure {

    public static void main(String args[]){

     List<User> users = new ArrayList<User>(2);
    
     for(int i=0; i<2; i++){
         try{
         users.add(new User(String.valueOf(i))); //will throw NoClassDefFoundError
         }catch(Throwable t){
             t.printStackTrace();
         }
     }         
    

    }
    }

class User{
private static String USER_ID = getUserId();

public User(String id){
    this.USER_ID = id;
}
private static String getUserId() {
    throw new RuntimeException("UserId Not found");
}     

}

Output
java.lang.ExceptionInInitializerError
at testing.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:23)
Caused by: java.lang.RuntimeException: UserId Not found
at testing.User.getUserId(NoClassDefFoundErrorDueToStaticInitFailure.java:41)
at testing.User.<clinit>(NoClassDefFoundErrorDueToStaticInitFailure.java:35)
... 1 more
java.lang.NoClassDefFoundError: Could not initialize class testing.User
at testing.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:23)

Read more: http://javarevisited.blogspot.com/2011/06/noclassdeffounderror-exception-in.html#ixzz3dqtbvHDy
1
2
————————————————
版權(quán)聲明:本文為CSDN博主「wd521521」的原創(chuàng)文章砾淌,遵循CC 4.0 BY-SA版權(quán)協(xié)議啦撮,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wd521521/article/details/80194625

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汪厨,一起剝皮案震驚了整個(gè)濱河市赃春,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌劫乱,老刑警劉巖织中,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锥涕,死亡現(xiàn)場離奇詭異,居然都是意外死亡狭吼,警方通過查閱死者的電腦和手機(jī)层坠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刁笙,“玉大人破花,你說我怎么就攤上這事∑N” “怎么了座每?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摘悴。 經(jīng)常有香客問我峭梳,道長,這世上最難降的妖魔是什么烦租? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任延赌,我火速辦了婚禮,結(jié)果婚禮上叉橱,老公的妹妹穿的比我還像新娘挫以。我一直安慰自己,他們只是感情好窃祝,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布掐松。 她就那樣靜靜地躺著,像睡著了一般粪小。 火紅的嫁衣襯著肌膚如雪大磺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天探膊,我揣著相機(jī)與錄音杠愧,去河邊找鬼。 笑死逞壁,一個(gè)胖子當(dāng)著我的面吹牛流济,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腌闯,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼绳瘟,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了姿骏?” 一聲冷哼從身側(cè)響起糖声,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蘸泻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琉苇,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蟋恬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翁潘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歼争,死狀恐怖拜马,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沐绒,我是刑警寧澤俩莽,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站乔遮,受9級(jí)特大地震影響扮超,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蹋肮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一出刷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坯辩,春花似錦馁龟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至改抡,卻和暖如春矢炼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阿纤。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工句灌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人欠拾。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓胰锌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親清蚀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子生蚁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容