2009-05-22 85 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,因此您需要这些运行时库。