javalangnoclassdeffounderror,javalangNoClassDefFoundError

本文目錄一覽:

怎麼解決java.lang.NoClassDefFoundError錯誤

1、項目依賴的jar包未全部導入;

如:java.lang.NoClassDefFoundError: Could not initialize class com.esms.common.util.XmlUtil,當你去查這個類的時候發現這個類是存在,之所以抱着個錯是

因為在這個類裏面的方法引用了其他jar包中的類的方法,而這個被引用的這個jar包剛好缺失,所以拋出這個錯。

解決辦法:一層一層去查找並導入缺失的jar包

2、類中package的地址不對

如:你在com.phome.demo1中有個類test.java,那麼這個類的package就是com.phome.demo1

這時候剛好你在com.phome.demo2下面也有一個test.java這個類,而這個類的package也是com.phome.demo1,這種情況下也會拋出這個錯。也許你會說這種情況在編寫代碼的時候會拋出這個錯,沒錯這種情況大多數情況下是可以避免的,但是我確實是遇到了,很詭異。

解決辦法:修改好名稱呢個重新編譯即可

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解決示例

當發生由於缺少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怎麼解決

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

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

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

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

如何解決java.lang.NoClassDefFoundError

NoClassDefFoundError錯誤的發生,是因為Java虛擬機在編譯時能找到合適的類,而在運行時不能找到合適的類導致的錯誤。簡單總結就是,NoClassDefFoundError發生在編譯時對應的類可用,而運行時在Java的classpath路徑中,對應的類不可用導致的錯誤。

很明顯NoClassDefFoundError的錯誤是因為在運行時類加載器在classpath下找不到需要加載的類,所以我們需要把對應的類加載到classpath中,或者檢查為什麼類在classpath中是不可用的,這個發生可能的原因如下:

1、對應的Class在java的classpath中不可用

2、你可能用jar命令運行你的程序,但類並沒有在jar文件的manifest文件中的classpath屬性中定義

3、可能程序的啟動腳本覆蓋了原來的classpath環境變量

4、因為NoClassDefFoundError是java因為NoClassDefFoundError是java.lang.LinkageError的一個子類,所以可能由於程序依賴的原生的類庫不可用而導致

5、檢查日誌文件中是否有java.lang.ExceptionInInitializerError這樣的錯誤,NoClassDefFoundError有可能是由於靜態初始化失敗導致的

6、如果你工作在J2EE的環境,有多個不同的類加載器,也可能導致NoClassDefFoundError

如何解決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中驗證,確保編譯和運行期都能找到此類。

原創文章,作者:IDOUG,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/328921.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
IDOUG的頭像IDOUG
上一篇 2025-01-13 21:49
下一篇 2025-01-14 18:54

相關推薦

發表回復

登錄後才能評論