本文目錄一覽:
- 1、如何解決Java.lang.NoClassDefFoundError
- 2、如何解決java.lang.NoClassDefFoundError
- 3、java.lang.NoClassDefFoundError怎麼解決
- 4、如何解決java.lang.NoClassDefFoundError問題
- 5、java.lang.NoClassDefFoundError是什麼意思
- 6、怎麼解決java.lang.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中驗證,確保編譯和運行期都能找到此類。
如何解決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