Я никогда раньше не видел это конкретное сообщение об ошибке, но могу немного объяснить, что оно означает, и указать одну возможную причину.
Линия
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
зависит от классов, отсутствующих в пути к классам. Возможно, стоит просмотреть список всех классов, import
ed Ejb3Configuration и убедитесь, что все те, у кого нет java.*
или javax.*
, находятся в JAR-файле, который могут видеть Glassfish и Netbeans.
Кроме того, я могу только предположить, почему JVM пытается загрузить Ejb3Configuration
дважды. Когда загрузка класса не удается в первый раз, выдается исключение (обычно это какой-то подкласс LinkageError
). Этот тип исключения не часто перехватывается, поэтому я думаю, что происходит что-то вроде следующего:
try {
// Some code that loads Ejb3Configuration and fails.
}
finally {
// Some code that also loads Ejb3Configuration and fails.
}
Если код в блоке finally
выдает исключение, это исключение заменит любое исключение, выброшенное в блоке try
. Я предлагаю это, потому что подобное произошло с этим вопросом. Трассировка стека, опубликованная в этом вопросе, исходит из блока finally
.
Если мой ответ по-прежнему вам не помогает, не могли бы вы опубликовать всю трассировку стека, которую вы видите?
person
Luke Woodward
schedule
22.05.2009