java.lang.noclassdeffounderror,javalangNoClassDefFoundError

本文目錄一覽:

如何解決Java.lang.NoClassDefFoundError

NoClassDefFoundError 問題原因1:缺少jar包

首先最常見的原因是classpath的配置問題。例子程序:

本例子程序嘗試創建一個新的CallerClassA實例,然後執行他的一個方法,此方法引用了類ReferencingClassA,本例子演示了classpath問題導致的NoClassDefFoundError ,本例子還列印了當前的classloader chain的情況,以便進一步的分析。這個列印信息對你以後分析此類問題也很有幫助的:

程序

Java代碼 收藏代碼

public class NoClassDefFoundErrorSimulator {

public static void main(String[] args) {

System.out

.println(“java.lang.NoClassDefFoundError Simulator”);

// Print current Classloader context

System.out.println(“\nCurrent ClassLoader chain: “

+ ClassloaderUtil.getCurrentClassloaderDetail());

// 1. Create a new instance of CallerClassA

CallerClassA caller = new CallerClassA();

// 2. Execute method of the caller

caller.doSomething();

System.out.println(“done!”);

}

}

Java代碼 收藏代碼

public class CallerClassA {

private final static String CLAZZ = CallerClassA.class.getName();

static {

System.out.println(“Classloading of ” + CLAZZ + ” in progress…”

+ ClassloaderUtil.getCurrentClassloaderDetail());

}

public CallerClassA() {

System.out.println(“Creating a new instance of “

+ CallerClassA.class.getName() + “…”);

}

public void doSomething() {

// Create a new instance of ReferencingClassA

ReferencingClassA referencingClass = new ReferencingClassA();

}

}

Java代碼 收藏代碼

public class ReferencingClassA {

private final static String CLAZZ = ReferencingClassA.class.getName();

static {

System.out.println(“Classloading of ” + CLAZZ + ” in progress…”

+ ClassloaderUtil.getCurrentClassloaderDetail());

}

public ReferencingClassA() {

System.out.println(“Creating a new instance of “

+ ReferencingClassA.class.getName() + “…”);

Maps.newHashMap();

}

public void doSomething() {

// nothing to do…

}

}

列印classloader工具類:

Java代碼 收藏代碼

public class ClassloaderUtil {

public static String getCurrentClassloaderDetail() {

StringBuffer classLoaderDetail = new StringBuffer();

StackClassLoader classLoaderStack = new StackClassLoader();

ClassLoader currentClassLoader = Thread.currentThread()

.getContextClassLoader();

classLoaderDetail

.append(“\n—————————————————————–\n”);

// Build a Stack of the current ClassLoader chain

while (currentClassLoader != null) {

classLoaderStack.push(currentClassLoader);

currentClassLoader = currentClassLoader.getParent();

}

// Print ClassLoader parent chain

while (classLoaderStack.size() 0) {

ClassLoader classLoader = classLoaderStack.pop();

// Print current

classLoaderDetail.append(classLoader);

if (classLoaderStack.size() 0) {

classLoaderDetail.append(“\n— delegation —\n”);

} else {

classLoaderDetail.append(” **Current ClassLoader**”);

}

}

classLoaderDetail

.append(“\n—————————————————————–\n”);

return classLoaderDetail.toString();

}

}

正常運行:

Java代碼 收藏代碼

java -classpath .;../guava-12.0.jar NoClassDefFoundError.NoClassDefFoundErrorSimulator

java.lang.NoClassDefFoundError Simulator

Current ClassLoader chain:

—————————————————————–

sun.misc.Launcher$ExtClassLoader@addbf1

— delegation —

sun.misc.Launcher$AppClassLoader@19821f **Current ClassLoader**

—————————————————————–

Classloading of NoClassDefFoundError.CallerClassA in progress…

—————————————————————–

sun.misc.Launcher$ExtClassLoader@addbf1

— delegation —

sun.misc.Launcher$AppClassLoader@19821f **Current ClassLoader**

—————————————————————–

Creating a new instance of NoClassDefFoundError.CallerClassA…

Classloading of NoClassDefFoundError.ReferencingClassA in progress…

—————————————————————–

sun.misc.Launcher$ExtClassLoader@addbf1

— delegation —

sun.misc.Launcher$AppClassLoader@19821f **Current ClassLoader**

—————————————————————–

Creating a new instance of NoClassDefFoundError.ReferencingClassA…

done!

異常重現:

Java代碼 收藏代碼

java -classpath . NoClassDefFoundError.NoCl

java.lang.NoClassDefFoundError Simulator

Current ClassLoader chain:

—————————————————————–

sun.misc.Launcher$ExtClassLoader@addbf1

— delegation —

sun.misc.Launcher$AppClassLoader@19821f **Current ClassLoader**

—————————————————————–

Classloading of NoClassDefFoundError.CallerClassA in progress…

—————————————————————–

sun.misc.Launcher$ExtClassLoader@addbf1

— delegation —

sun.misc.Launcher$AppClassLoader@19821f **Current ClassLoader**

—————————————————————–

Creating a new instance of NoClassDefFoundError.CallerClassA…

Classloading of NoClassDefFoundError.ReferencingClassA in progress…

—————————————————————–

sun.misc.Launcher$ExtClassLoader@addbf1

— delegation —

sun.misc.Launcher$AppClassLoader@19821f **Current ClassLoader**

—————————————————————–

Creating a new instance of NoClassDefFoundError.ReferencingClassA…

Exception in thread “main” java.lang.NoClassDefFoundError: com/google/common/collect/Maps

at NoClassDefFoundError.ReferencingClassA.init(ReferencingClassA.java:28)

at NoClassDefFoundError.CallerClassA.doSomething(CallerClassA.java:31)

at NoClassDefFoundError.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.jav

Caused by: java.lang.ClassNotFoundException: com.google.common.collect.Maps

at java.net.URLClassLoader$1.run(URLClassLoader.java:202)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:190)

at java.lang.ClassLoader.loadClass(ClassLoader.java:306)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

… 3 more

發生了什麼?當你在classpath中不包含guava的引用的時候,由於ReferencingClassA在運行期引用了此類,導致了classloader報告找不到此類,從而出現NoClassDefFoundError。

classloader分析

注意:

Java代碼 收藏代碼

Classloading of NoClassDefFoundError.CallerClassA in progress…

—————————————————————–

sun.misc.Launcher$ExtClassLoader@addbf1

— delegation —

sun.misc.Launcher$AppClassLoader@19821f **Current ClassLoader**

————————-

sun.misc.Launcher$AppClassLoader是系統的classloader,負責根據classpath設置在啟動的時候載入應用需要的class。

sun.misc.Launcher$ExtClassLoader是擴展classloader,負責從java_home/lib/etc以及其他使用java.ext.dirs配置的目錄從載入擴展java class。

從列印結果可以看出,sun.misc.Launcher$ExtClassLoader是系統classloader的實際父類。

建議處理策略

分析異常堆棧,找到缺少的java類名稱,在classpath中驗證,確保編譯和運行期都能找到此類。

如何解決java.lang.NoClassDefFoundError

1、NoClassDefFoundError錯誤發生的原因

NoClassDefFoundError錯誤的發生,是因為Java虛擬機在編譯時能找到合適的類,而在運行時不能找到合適的類導致的錯誤。例如在運行時我們想調用某個類的方法或者訪問這個類的靜態成員的時候,發現這個類不可用,此時Java虛擬機就會拋出NoClassDefFoundError錯誤。

2、classpath環境變數配置錯誤.

解決辦法:

在系統環境變數那一欄中點-新建classpath。

變數名:classpath

變數值: .;%JAVA_HOME%/lib/;%JAVA_HOME%/jre/lib/

(注意,CLASSPATH最前面是有個「.」的,表示當前目錄,這樣當我們運行javaAClass的時候,系統就會先在當前目錄尋找AClass文件了。)

3、環境變數配置正確,但載入第三方包的時候會報錯,比如: java.lang.NoClassDefFoundError:com.ryong21.io.net.NetClient

解決辦法:

①.項目根目錄下新建一個libs文件夾

②.把要加的包放到這個目錄下

③.右鍵 Build Path- Use as source folder

④.在jar包上右鍵-add to build path

4、NoClassDefFoundError也可能由於類的靜態初始化模塊錯誤導致,當你的類執行一些靜態初始化模塊操作,如果初始化模塊拋出異常,哪些依賴這個類的其他類會拋出NoClassDefFoundError的錯誤。如果你查看程序日誌,會發現一些java.lang.ExceptionInInitializerError的錯誤日誌,ExceptionInInitializerError的錯誤會導致java.lang.NoClassDefFoundError: Could not initialize class

5、由於NoClassDefFoundError是LinkageError的子類,而LinkageError的錯誤在依賴其他的類時會發生,所以如果你的程序依賴原生的類庫和需要的dll不存在時,有可能出現java.lang.NoClassDefFoundError。這種錯誤也可能拋出java.lang.UnsatisfiedLinkError: no dll in java.library.path Exception Java這樣的異常。解決的辦法是把依賴的類庫和dll跟你的jar包放在一起。

6、Jar文件的許可權問題也可能導致NoClassDefFoundError,如果你的程序運行在像linux這樣多用戶的操作系統種,你需要把你應用相關的資源文件,如Jar文件,類庫文件,配置文件的許可權單獨分配給程序所屬用戶組,如果你使用了多個用戶不同程序共享的jar包時,很容易出現許可權問題。比如其他用戶應用所屬許可權的jar包你的程序沒有許可權訪問,會導致java.lang.NoClassDefFoundError的錯誤。

7、基於XML配置的程序也可能導致NoClassDefFoundError的錯誤。比如大多數Java的框架像Spring,Struts使用xml配置獲取對應的bean信息,如果你輸入了錯誤的名稱,程序可能會載入其他錯誤的類而導致NoClassDefFoundError異常。我們在使用Spring MVC框架或者Apache Struts框架,在部署War文件或者EAR文件時就經常會出現Exception in thread 「main」 java.lang.NoClassDefFoundError。

希望對你有幫助

java.lang.NoClassDefFoundError怎麼解決

NoClassDefFoundError錯誤的發生,是因為Java虛擬機在編譯時能找到合適的類,而在運行時不能找到合適的類導致的錯誤。

NoClassDefFoundError發生在編譯時對應的類可用,而運行時在Java的classpath路徑中,對應的類不可用導致的錯誤。

NoClassDefFoundError的錯誤是因為在運行時類載入器在classpath下找不到需要載入的類,所以我們需要把對應的類載入到classpath中,或者檢查為什麼類在classpath中是不可用的

看看是不是缺失jar包,或者jdk安裝正不正確

如何解決java.lang.NoClassDefFoundError問題

NoClassDefFoundError解決示例

當發生由於缺少jar文件,或者jar文件沒有添加到classpath,或者jar的文件名發生變更會導致java.lang.NoClassDefFoundError的錯誤。

當類不在classpath中時,這種情況很難確切的知道,但如果在程序中列印出System.getproperty(「java.classpath」),可以得到程序實際運行的classpath

運行時明確指定你認為程序能正常運行的 -classpath 參數,如果增加之後程序能正常運行,說明原來程序的classpath被其他人覆蓋了。

NoClassDefFoundError也可能由於類的靜態初始化模塊錯誤導致,當你的類執行一些靜態初始化模塊操作,如果初始化模塊拋出異常,哪些依賴這個類的其他類會拋出NoClassDefFoundError的錯誤。如果你查看程序日誌,會發現一些java.lang.ExceptionInInitializerError的錯誤日誌,ExceptionInInitializerError的錯誤會導致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[]){

ListUser users = new ArrayListUser(2);

for(int i=0; i2; 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)

java.lang.NoClassDefFoundError是什麼意思

java.lang.NoClassDefFoundError:

找不到相應的類文件,當編譯源文件以後都會生成一些類文件:***.class,執行時要用java(main所在的類) ,如果找不到相應的類,執行就會出現NoClassDefFoundError的異常。

1、首先請確認沒有錯敲成java xxx.class,

2、其次,檢查CLASSPATH環境變數,

3、將java文件按包名存放:

比如工作目錄是/work,類是package1.class1,那麼將它存放為/work/package1/class1.java。如果沒有聲明包,那麼直接放在/work下。

怎麼解決java.lang.NoClassDefFoundError錯誤

NoClassDefFoundError錯誤的發生,是因為Java虛擬機在編譯時能找到合適的類,而在運行時不能找到合適的類導致的錯誤。也就是說;,NoClassDefFoundError發生在編譯時對應的類可用,而運行時在Java的classpath路徑中,對應的類不可用導致的錯誤。解決方法要根據實際情況來判定,錯誤原因有以下幾種:1)當發生由於缺少jar文件,或者jar文件沒有添加到classpath,或者jar的文件名發生變更會導致java.lang.NoClassDefFoundError的錯誤。2)當類不在classpath中時,這種情況很難確切的知道,但如果在程序中列印出System.getproperty(「java.classpath」),可以得到程序實際運行的classpath運行時明確指定你認為程序能正常運行的-classpath參數,如果增加之後程序能正常運行,說明原來程序的classpath被其他人覆蓋了。3)NoClassDefFoundError也可能由於類的靜態初始化模塊錯誤導致,當你的類執行一些靜態初始化模塊操作,如果初始化模塊拋出異常,哪些依賴這個類的其他類會拋出NoClassDefFoundError的錯誤

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/246610.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:16
下一篇 2024-12-12 13:16

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論