記錄一個我所遇到的 java.lang.NoClassDefFoundError 異常

問題出現的原因:
雖然在IDE中的目錄結構下有相關的.class文件,但是由於由於在根類加載器的類加載目錄下放置了部分.class文件,但不是全部.class文件,所以報錯。

解決途徑:

  1. 刪除相關根類加載器的目錄結構
  2. 在根類加載器的目錄結構下放置全部相關的.class文件

案例詳細:
根類加載器的有效目錄:

public static void main(String[] args) {
        System.out.println("根加載器加載的Jar包的存放物理地址:"+System.getProperty("sun.boot.class.path"));
        }

控制檯輸出:

根加載器的存儲路徑:C:\Program Files\Java\jdk1.8.0_211\jre\lib\resources.jar;
C:\Program Files\Java\jdk1.8.0_211\jre\lib\rt.jar;
C:\Program Files\Java\jdk1.8.0_211\jre\lib\sunrsasign.jar;
C:\Program Files\Java\jdk1.8.0_211\jre\lib\jsse.jar;
C:\Program Files\Java\jdk1.8.0_211\jre\lib\jce.jar;
C:\Program Files\Java\jdk1.8.0_211\jre\lib\charsets.jar;
C:\Program Files\Java\jdk1.8.0_211\jre\lib\jfr.jar;
C:\Program Files\Java\jdk1.8.0_211\jre\classes

我僅在目錄:C:\Program Files\Java\jdk1.8.0_211\jre\classes下放置了MyTest.class文件。MyTest,java文件如下:

public class MyTest1 {
    public static void main(String[] args) {
        System.out.println(MyChild1.str);
    }

}


class MyParent1 {
    public static String str = "hello world";

    static {
        System.out.println("MyParent static block.");
    }
}

class MyChild1 extends MyParent1 {
     static {
        System.out.println("MyChild1 static block.");
    }
}

MyTest1 其引用了MyParent1以及MyChild1。
當前目錄下僅僅只有:MyTest1.class文件,所以執行MyTest1.java中的main方法,報錯:

Exception in thread "main" java.lang.NoClassDefFoundError: classloader/MyChild1
	at classloader.MyTest1.main(MyTest1.java:11)

採用下面兩個方法解決了這個異常。

  1. 刪除相關根類加載器的目錄結構
  2. 在根類加載器的目錄結構下放置全部相關的.class文件(此例中爲MyParent1以及MyChild1的class文件)

結論:
要注意命名空間、類加載器雙親委託機制以及加載路徑的關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章