本文目錄一覽:
- 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錯誤
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-hant/n/328921.html