2009-05-22 84 views
2

我已經將Hibernate庫放入了Glassfish域和NetBeans中項目的庫集合中。 hibernate-entitymanager.jar包含HibernatePersistence(調用堆棧中的最後一個類)和Ejb3Configuration,所以我非常難以理解爲什麼我會爲Ejb3Configuration獲取缺少的類錯誤。Glassfish中的休眠 - Ejb3Configuration NoClassDefFoundError

java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.ejb.Ejb3Configuration 
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:130) 
    at com.sun.enterprise.server.PersistenceUnitLoaderImpl.load(PersistenceUnitLoaderImpl.java:149) 
    at com.sun.enterprise.server.PersistenceUnitLoaderImpl.load(PersistenceUnitLoaderImpl.java:84) 
... 

回答

8

我從來沒有見過此特定錯誤消息之前,但我可以簡要介紹一下這是什麼意思,給一個可能的原因。

 
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塊。

如果我的答案仍然無法幫助您,請您發佈您看到的整個堆棧跟蹤?

+0

看起來它確實在Log4J配置中,除了服務器首次重新啓動時,堆棧跟蹤中沒有提及。 – 2009-05-26 15:47:38

3

我也有這個問題,但它似乎是一個版本特定的問題在我的情況。較新版本的hibernate依賴於Java的簡單日誌門面(SLF4J),但maven構件只包含API,因此您需要在WAR或服務器的lib文件夾中運行時庫。

這是特定於3.4.0版本的Hibernate Entity Manager,儘管它也可能適用於其他版本。如果您使用的是Hibernate Core 3.3.x,則您使用的是3.4.x系列的Hibernate EM,因此您需要這些運行時庫。