我从来没有见过此特定错误消息之前,但我可以简要介绍一下这是什么意思,给一个可能的原因。
线
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
块。
如果我的答案仍然无法帮助您,请您发布您看到的整个堆栈跟踪?
看起来它确实在Log4J配置中,除了服务器首次重新启动时,堆栈跟踪中没有提及。 – 2009-05-26 15:47:38