我從來沒有見過此特定錯誤消息之前,但我可以簡要介紹一下這是什麼意思,給一個可能的原因。
線
java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.ejb.Ejb3Configuration
並不意味着JVM找不到類org.hibernate.ejb.Ejb3Configuration
。這意味着JVM可以找到這個類,但它已經試過並且無法加載這個類。
這是文本Could not initialize class ...
,表明發生了這種情況。如果JVM可能根本找不到的類,你會得到類似下面的代替:
java.lang.NoClassDefFoundError: org/hibernate/ejb/Ejb3Configuration
順便說一句,這也意味着你使用的是Java 6 - Java 5中相應的異常沒有信息。
以下兩個類提供了此行爲的演示。無法加載Unloadable
類,因爲它的靜態初始化器始終引發異常。我們嘗試加載此類,捕獲結果爲ExceptionInInitializerError
,並嘗試再次加載Unloadable
。
class Unloadable {
static {
if (true) { throw new RuntimeException(); }
}
}
public class LoadingTest {
public static void main(String[] args) throws Exception {
try {
Class.forName("Unloadable");
}
catch (ExceptionInInitializerError e) {
try {
Class.forName("Unloadable");
}
catch (NoClassDefFoundError e2) {
System.out.println("XXXXXXXXXXXXXXXXXXXXX");
e2.printStackTrace(System.out);
}
}
}
}
當我運行LoadingTest
類,我得到下面的輸出:
XXXXXXXXXXXXXXXXXXXXX
java.lang.NoClassDefFoundError: Could not initialize class Unloadable
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at LoadingTest.main(LoadingTest.java:14)
我不能說是什麼原因造成原試圖加載org.hibernate.ejb.Ejb3Configuration
失敗。很可能Ejb3Configuration
本身依賴於類路徑中缺少的類。可能值得通過Ejb3Configuration編輯的所有類import
的列表,並確保所有不在java.*
或javax.*
之下的所有類都在Glassfish和Netbeans可以看到的JAR內。
此外,我只能推測爲什麼JVM試圖加載Ejb3Configuration
兩次。當類加載首次失敗時,拋出一個異常(通常是LinkageError
的一些子類)。這種類型的異常是不是經常抓,所以我最好的猜測是,像下面發生的事情:
try {
// Some code that loads Ejb3Configuration and fails.
}
finally {
// Some code that also loads Ejb3Configuration and fails.
}
如果finally
塊中的代碼拋出一個異常,這個異常將取代拋出的任何異常try
塊。我建議這是因爲類似的事情發生在this question。此問題中發佈的堆棧跟蹤來自finally
塊。
如果我的答案仍然無法幫助您,請您發佈您看到的整個堆棧跟蹤?
看起來它確實在Log4J配置中,除了服務器首次重新啓動時,堆棧跟蹤中沒有提及。 – 2009-05-26 15:47:38