代码之家  ›  专栏  ›  技术社区  ›  Jeff Ferland

在GlassFish中休眠-EJB3配置NoClassDefoundError

  •  2
  • Jeff Ferland  · 技术社区  · 15 年前

    我把Hibernate库放在GlassFish域和我在NetBeans项目的库集合中。 hibernate-entitymanager.jar 包含HibernatePersistence(调用堆栈中的最后一个类)和EJB3配置,因此我很难理解为什么我会得到EJB3配置缺少的类错误。

    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)
    ...
    
    2 回复  |  直到 15 年前
        1
  •  8
  •   Community vonPryz    7 年前

    我以前从未见过这个特定的错误消息,但是我可以解释一下它的含义,并给出一个可能的原因。

    线

    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 结果,并尝试加载 可卸载的 再一次。

    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.ejb3配置 失败。很可能是那样 Ejb3Configuration 它本身依赖于类路径中缺少的类。可能值得浏览一下所有课程的列表 import 埃德 Ejb3Configuration 确保所有不低于 java.* javax.* 在玻璃鱼和网豆能看到的罐子里。

    另外,我只能推测为什么JVM试图加载 EJB3配置 两次 . 当类加载第一次失败时,异常(通常是 LinkageError )被抛出。这种类型的异常通常不会被捕获,所以我的最佳猜测是发生了如下情况:

    try {
        // Some code that loads Ejb3Configuration and fails.
    }
    finally {
        // Some code that also loads Ejb3Configuration and fails.
    }
    

    如果代码在 finally 块引发异常,此异常将替换在 try 块。我建议这样做是因为发生了类似的事情 this question . 此问题中发布的堆栈跟踪来自 最后 块。

    如果我的回答仍然对你没有帮助,你能把你看到的整个堆栈跟踪都贴出来吗?

        2
  •  3
  •   SplinterReality    15 年前

    我也有这个问题,尽管在我的例子中它似乎是一个版本特定的问题。Hibernate的更新版本依赖于Java(SLF4J)的简单日志外观,但是Maven工件只包含API,因此您需要在您的战争或服务器的LIB文件夹中运行库。

    这是Hibernate实体管理器的3.4.0版本特有的,尽管它也适用于其他版本。如果您使用的是HibernateCore3.3.x,那么您将使用HibernateEm的3.4.x系列,因此您需要这些运行库。