public class PropHolder {
public static Properties prop;
static {
//code for loading properties from file
}
}
// Referencing the class somewhere else:
Properties prop = PropHolder.prop;
class PropHolder
ist eine Klasse für mich. Die Klasse befindet sich in derselben JAR-Datei der Hauptklasse. Das sollte also nicht so sein, weil JAR im Klassenpfad fehlt.
Wenn ich in die JAR-Datei von schaue jar tf myjarfile
, kann ich die dort PropHolder.class
aufgelistete sehen.
Übrigens: Der Code läuft auf meinem lokalen Computer einwandfrei. Konnte aber nicht funktionieren, wenn ich es mit einem Skript auf einem Linux-Server bereitstelle. Ich denke, es ist nicht das Problem des Codes. Aber aus irgendeinem Grund. Der Bereitstellungsprozess ist sehr schwer zu verfolgen.
Was könnte das Problem sein?
Antworten:
Meine beste Wette ist, dass es hier ein Problem gibt:
Es scheint, dass eine nicht erfasste Ausnahme aufgetreten ist und bis zum tatsächlichen ClassLoader weitergegeben wurde, der versucht, die Klasse zu laden. Wir würden jedoch einen Stacktrace benötigen, um dies zu bestätigen.
Entweder das oder es ist beim Erstellen einer
PropHolder.prop
statischen Variablen aufgetreten .quelle
static
Problem liegt. Was muss getan werden, um das Problem zu lösen?static
Block ausgelöst wird . Um es zu debuggen, setzen Sie eintry/catch(Exception e)
um den gesamten Block und protokollieren Sie die Ausnahme. Sie müssen diese Ausnahme beheben. Normalerweise wird die Ausnahme protokolliert, ist jedoch möglicherweise schwer zu finden, da sie während des Klassenladevorgangs protokolliert wird, was sehr früh erfolgen kanntry catch
blockiert und es standFailed to initialize ClassA
. Ich denke es ist das Problem vonJVM
. Ich habe mein System neu gestartet und dann hat alles gut funktioniert. Wie kann ich dieses Problem in Zukunft lösen, ohne mein System neu zu starten, und das Problem mit einer einfachen Lösung lösen?cause
falls verfügbar. ANoClassDefFoundError
ist immer mit einem anderen Fehler verbunden. Sie müssen ihn in den Protokollen suchen oder versuchen, ihn angemessener zu protokollieren (z. B. die Protokollierung in eine neue Datei im Dateisystem erzwingen)Sie erhalten eine,
java.lang.NoClassDefFoundError
was NICHT bedeutet, dass Ihre Klasse fehlt (in diesem Fall würden Sie eine bekommenjava.lang.ClassNotFoundException
). Der ClassLoader hat beim Lesen der Klassendefinition einen Fehler beim Lesen der Klasse festgestellt.Legen Sie einen Versuch / Fang in Ihren statischen Initialisierer und sehen Sie sich die Ausnahme an. Wenn Sie dort einige Dateien lesen und diese sich von Ihrer lokalen Umgebung unterscheiden, ist dies höchstwahrscheinlich die Ursache des Problems (möglicherweise kann die Datei nicht gefunden werden, keine Berechtigungen usw.).
quelle
@Stateless
, also fügte ich einfach die entsprechende Abhängigkeit hinzu und konnte fortfahren. Danke für den Tipp!NoClassDefFoundError gibt keinen großen Hinweis darauf, was im statischen Block schief gelaufen ist. Es wird empfohlen, immer einen solchen Block im statischen {...} Initialisierungscode zu haben:
quelle
Ich hatte die gleiche Ausnahme, so habe ich das Problem gelöst:
Voraussetzungen:
Junit-Klasse (und Test), die eine weitere Klasse erweitert hat.
ApplicationContext wurde mit spring initialisiert und initiiert das Projekt.
Der Anwendungskontext wurde in der @ Before-Methode initialisiert
Lösung:
Initialisieren Sie den Anwendungskontext über die @ BeforeClass-Methode, da für die übergeordnete Klasse auch einige Klassen erforderlich sind, die aus dem Anwendungskontext heraus initialisiert wurden.
Hoffe das wird helfen.
quelle
Wie oben erwähnt, kann dies eine Reihe von Dingen sein. In meinem Fall hatte ich eine statisch initialisierte Variable, die auf einem fehlenden Eintrag in meiner Eigenschaftendatei beruhte. Der fehlende Eintrag zur Eigenschaftendatei wurde hinzugefügt und das Problem wurde behoben.
quelle
Vor einigen Tagen habe ich die gleiche Frage wie Ihre gestellt. Der gesamte Code läuft gut auf meinem lokalen Computer, stellt sich jedoch als Fehler heraus (noclassdeffound & initialize). Also poste ich meine Lösung, aber ich weiß nicht warum, ich mache nur eine Möglichkeit. Ich hoffe, jemand weiß, dass dies erklärt wird. @ John Vint Zuerst zeige ich Ihnen mein Problem. Mein Code hat sowohl eine statische Variable als auch einen statischen Block. Als ich dieses Problem zum ersten Mal traf, versuchte ich die Lösung von John Vint und versuchte, die Ausnahme abzufangen. Ich habe jedoch nichts gefangen. Also dachte ich, es liegt daran, dass die statische Variable (aber jetzt weiß ich, dass sie dasselbe sind) und immer noch nichts gefunden hat. Also versuche ich den Unterschied zwischen dem Linux-Computer und meinem Computer zu finden. Dann stellte ich fest, dass dieses Problem nur auftritt, wenn mehrere Threads in einem Prozess ausgeführt werden (der Linux-Computer verfügt übrigens über doppelte Kerne und doppelte Prozesse). Das heißt, wenn zwei Tasks (beide verwenden den Code mit statischen Blöcken oder Variablen) im selben Prozess ausgeführt werden, geht dies schief. Wenn sie jedoch in unterschiedlichen Prozessen ausgeführt werden, sind beide in Ordnung. In der Linux-Maschine benutze ich
Um eine Aufgabe auszuführen, und weil meine statische Variable darin besteht, einen Container zu starten (oder vielleicht einen neuen Klassenladeprogramm zu initialisieren), bleibt sie so lange bestehen, bis die JVM stoppt, und die JVM stoppt nur, wenn alle Aufgaben in einem Prozess gestoppt sind. Jede Aufgabe startet einen neuen Container (oder Klassenlader) und verwirrt das JVM. Infolgedessen tritt der Fehler auf. Also, wie kann man das lösen? Meine Lösung besteht darin, dem Befehl maven einen neuen Befehl hinzuzufügen und jede Aufgabe in denselben Container zu verschieben.
Vielleicht haben Sie dieses Problem bereits gelöst, hoffen aber dennoch, dass es anderen hilft, die das gleiche Problem haben.
quelle
java.lang.ExceptionInInitializerError: null
Dies bedeutet, dass die Klasse im Klassenladeprogramm nicht gefunden werden kann oder nicht weiß, welche geladen werden soll (denke ich). Hast du das getroffen?Ich hatte die gleiche Ausnahme - aber nur während ich im Debug-Modus lief, löste ich das Problem auf diese Weise (nach 3 ganzen Tagen): In der build.gradle hatte ich: "multiDexEnabled true" im Abschnitt defaultConfig festgelegt.
aber anscheinend war das nicht genug. aber als ich mich änderte:
zu:
das löste es. hoffe, das wird jemandem helfen
quelle
Wenn Sie an einem Android-Projekt arbeiten, stellen Sie sicher, dass Sie keine statischen Methoden für Android-Klassen aufrufen. Ich verwende nur JUnit + Mockito. Vielleicht helfen Ihnen einige andere Frameworks dabei, das Problem insgesamt zu vermeiden. Ich bin mir nicht sicher.
Mein Problem bestand darin,
Uri.parse(uriString)
als Teil eines statischen Initialisierers einen Unit-Test durchzuführen. Die Uri-Klasse ist eine Android-API, weshalb der Unit-Test-Build sie nicht finden konnte. Ich habe diesen Wertnull
stattdessen geändert und alles wurde wieder normal.quelle
Ich hatte die gleichen Probleme: java.lang.NoClassDefFoundError: Klasse com.xxx.HttpUtils konnte nicht initialisiert werden
Es ist das Umgebungsproblem. Das bedeutet, dass die Eigenschaften in application.yml falsch oder leer sind!
quelle
Ich stoße auf das gleiche Problem. Ich habe ein Bean-Objekt in einem statischen Block wie folgt gestartet:
Nur weil der Prozess, bei dem mein Bohnenobjekt ausgelöst wurde, eine NPE verursachte, bekomme ich Probleme damit. Ich denke, Sie sollten Ihren statischen Codeblock sorgfältig prüfen.
quelle