Glassfish中的Hibernate - Ejb3Configuration NoClassDefFoundError

Jef*_*and 2 netbeans hibernate glassfish java-ee ejb-3.0

我把Hibernate库放在Glassfish域和Netbeans中项目的库集合中.hibernate-entitymanager.jar包含HibernatePersistence(调用堆栈中的最后一个类)和Ejb3Configuration,所以我很难过为什么我得到了Ejb3Configuration缺少的类错误.

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)
...
Run Code Online (Sandbox Code Playgroud)

Luk*_*ard 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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行类时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本身依赖于类路径中缺少的类.可能值得浏览Ejb3Configurationimport编辑的所有类的列表,并确保所有那些不在Glassfish和Netbeans可以看到的JAR中或在其中的人.java.*javax.*

此外,我只能推测JVM为什么要尝试加载Ejb3Configuration 两次.当类加载第一次失败时,抛出异常(通常是某些子类LinkageError).这种类型的异常通常不会被捕获,因此我最好的猜测是发生以下情况:

try {
    // Some code that loads Ejb3Configuration and fails.
}
finally {
    // Some code that also loads Ejb3Configuration and fails.
}
Run Code Online (Sandbox Code Playgroud)

如果finally块中的代码抛出异常,则此异常将替换块中抛出的任何异常try.我建议这是因为在这个问题上发生了类似的事情.此问题中发布的堆栈跟踪来自一个finally块内.

如果我的回答仍然没有帮助你,你能否发布你看到的整个堆栈跟踪?