我以前从未见过这个特定的错误消息,但我可以解释一下它的含义并给出一个可能的原因。
线
java.lang.NoClassDefFoundError:无法初始化类 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);
}
}
}
}
当我运行 classLoadingTest
时,我得到以下输出:
XXXXXXXXXXXXXXXXXXXXX
java.lang.NoClassDefFoundError:无法初始化类 Unloadable
在 java.lang.Class.forName0(本机方法)
在 java.lang.Class.forName(Class.java:169)
在 LoadingTest.main(LoadingTest.java:14)
我不能说是什么导致了最初的加载尝试org.hibernate.ejb.Ejb3Configuration
失败。很可能它Ejb3Configuration
本身取决于类路径中缺少的类。可能值得仔细阅读import
由Ejb3Configuration编辑的所有类的列表,并确保所有那些不在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.
}
如果finally
块中的代码抛出异常,则该异常将替换块中抛出的任何异常try
。我建议这样做是因为在这个问题上发生了类似的事情。此问题中发布的堆栈跟踪来自一个finally
块内。
如果我的回答仍然对您没有帮助,您能否发布您看到的整个堆栈跟踪?