|
如何解決NoClassDefFoundError--第二部分
第一部分請(qǐng)看:http://vipcowrie./blog/1561291 本文面向的是JAVA初學(xué)者,建議你們自己編譯和運(yùn)行例子程序。 本文包含了NoClassDefFoundError的原因分析和例子程序,并且給出了建議的處理策略。 NoClassDefFoundError 問(wèn)題原因1:缺少jar包 首先最常見(jiàn)的原因是classpath的配置問(wèn)題。例子程序: 本例子程序嘗試創(chuàng)建一個(gè)新的CallerClassA實(shí)例,然后執(zhí)行他的一個(gè)方法,此方法引用了類(lèi)ReferencingClassA,本例子演示了classpath問(wèn)題導(dǎo)致的NoClassDefFoundError ,本例子還打印了當(dāng)前的classloader chain的情況,以便進(jìn)一步的分析。這個(gè)打印信息對(duì)你以后分析此類(lèi)問(wèn)題也很有幫助的: 程序 Java代碼
Java代碼
Java代碼
打印classloader工具類(lèi): Java代碼
正常運(yùn)行: Java代碼
異常重現(xiàn): Java代碼
發(fā)生了什么?當(dāng)你在classpath中不包含guava的引用的時(shí)候,由于ReferencingClassA在運(yùn)行期引用了此類(lèi),導(dǎo)致了classloader報(bào)告找不到此類(lèi),從而出現(xiàn)NoClassDefFoundError。 classloader分析 注意: Java代碼
sun.misc.Launcher$AppClassLoader是系統(tǒng)的classloader,負(fù)責(zé)根據(jù)classpath設(shè)置在啟動(dòng)的時(shí)候加載應(yīng)用需要的class。 sun.misc.Launcher$ExtClassLoader是擴(kuò)展classloader,負(fù)責(zé)從java_home/lib/etc以及其他使用java.ext.dirs配置的目錄從加載擴(kuò)展java class。 從打印結(jié)果可以看出,sun.misc.Launcher$ExtClassLoader是系統(tǒng)classloader的實(shí)際父類(lèi)。 建議處理策略 分析異常堆棧,找到缺少的java類(lèi)名稱(chēng),在classpath中驗(yàn)證,確保編譯和運(yùn)行期都能找到此類(lèi)。 |
|
|