我以前从未见过这个特定的错误消息,但我可以解释一下它的含义并给出一个可能的原因。
The line
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
again.
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
本身取决于类路径中缺少的类。可能值得浏览所有类别的列表import
ed by 并确保所有不在以下范围内的人java.*
or javax.*
位于 Glassfish 和 Netbeans 可以看到的 JAR 中。
另外,我只能推测 JVM 为何尝试加载Ejb3Configuration
twice。当第一次类加载失败时,会出现异常(通常是某个类的子类)LinkageError
)被抛出。这种类型的异常并不经常被捕获,所以我最好的猜测是发生了类似以下的事情:
try {
// Some code that loads Ejb3Configuration and fails.
}
finally {
// Some code that also loads Ejb3Configuration and fails.
}
如果代码中finally
块抛出异常,该异常将替换块中抛出的任何异常try
堵塞。我建议这样做是因为类似的事情发生在这个问题 https://stackoverflow.com/questions/596999。这个问题中发布的堆栈跟踪来自finally
block.
如果我的回答仍然对您没有帮助,您可以发布您看到的整个堆栈跟踪吗?