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