Никога преди не съм виждал това конкретно съобщение за грешка, но мога да обясня малко какво означава и да дам една възможна причина.
Линията
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
да зависи от класове, които липсват в classpath. Може би си струва да прегледате списъка с всички класове, 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