2013-06-19 30 views
-1

我有一個有靜態final方法的類[說A,B,C]。靜態final方法的java.lang.NoClassDefFoundError

C調用另一個類D [D的包在C中導入]。

Maven組裝jar [說M.jar],我沒有包D。 在運行時,當我嘗試調用類路徑中具有M.jar的A時,獲取noclasdef錯誤,說D不存在。

爲什麼我得到這個?

package TEST1 
import test.CHECK.TestA; 
import test.CHECK.TestB; 
class Factory 

{ 

final static A() 
{ 
//some ref to test.CHECK.TestA 
} 


static B() 
{ 
//some ref to test.CHECK.TestB 
} 

static C() 
{ 
} 

我有一個jar包含此類和包test.CHECK.TestB在該jar中。但是,這個jar不包含test.CHECK.TestA。

現在,我的客戶端程序有這個jar調用C()。 然後,獲取TestA的ClassNotFoundException,但我們沒有調用A()。這是爲什麼?

+5

不要混淆代碼,變得很難理解 –

+0

請在這裏發表您的代碼.. –

+0

請提供更多的細節來說明你的問題 - 顯示出一些實際的代碼將上升答案 – mschenk74

回答

2

沒有找到class def錯誤意味着您的類已找到,但JVM在運行時未能加載它。大多數情況下,問題在於你的類D沒有被調用它的類加載到同一個類加載器中。另一個問題可能來自D類初始化,由於一些不明原因而失敗......如果您需要一些幫助,我們需要您提供完整的堆棧跟蹤。

+1

「另一個pb可能來自D類初始化失敗」< - 如果發生這種情況,則會依賴於此NoClassDefFoundError – fge

+0

之前的另一個異常。我認爲如果因爲JVM無法加載類定義而出現錯誤,那麼靜態塊初始化會引發無類定義錯誤 – omartin

+0

我提供了詳細信息 – user170114

0

我覺得問題是當你調用C()靜態方法時,你的代碼第一次會引用Factory類(假設它沒有加載到內存中)。

所以當你的Factory類被加載時,它會嘗試加載所有的static方法,那時JVM由於某種原因不能加載TestA類,這就是爲什麼這個錯誤出現了。

嘗試從調用C()的類中調用A()方法來查看它是否成功。

1

爲什麼你得到ClassNotFoundException的

當JVM裝載在內存中的一類,它會嘗試加載它的依賴以及(其他類這個類代碼依賴)。由於您的類具有對test.CHECK.TestA的引用,JVM會嘗試加載此缺少的類(請參閱Java虛擬機規範,第12章,也是這樣:ClassLoader : possible configure to use lazy and not static resolution?)。

如何使JVM不嘗試加載缺少的類?

這是不可能的,至少與Oracle的JVM

可能的解決方案

嘗試在谷歌/冰/不管,看是否缺少類的全名(包括包名)搜索你可以找到丟失的類,並把它添加到你的classpath

另一種可能的解決方案(極其醜陋的解決方法 - 孩子,在家裏不這樣做)

如果你找不到這樣的類,並且如果你迫不及待地讓它運行,那麼你完全可以確保方法A從來沒有被使用,即使通過方法C這是你使用的方法,然後嘗試通過「嘲弄」(寫下「空白」替代品)丟失的包裹,缺失的類別和缺少的方法;這將涉及編譯/執行/ error_thrown/edit_again的嘗試錯誤過程。我知道這是非常醜陋的,但在一天結束時,你可以讓你的班級跑步。