NoClassDefFoundError auf ein interface, keine Klasse
Ich habe ein Problem mit NoClassDefFoundError
. Ich bin mit Schnittstellen, und keine definition der Klasse verfügbar sein sollen:
package code;
public interface Constants {...}
Klasse diese Schnittstelle implementiert, kompiliert ohne Fehler, und eine JAR-Datei erstellt wurde, aber zur Laufzeit gibt es mir einen Fehler.
import ...;
import code.*;
public class MultiDoc extends LanguageAnalyser implements Constants{}
Constants
enthält nur eine Liste von Konstanten.
Las ich einige Beiträge zeigen auf CLASSPATH als eine Ursache für dieses problem, aber ich habe die code
Paket in meinem CLASSPATH. Wenn ich nicht haben, es produzieren würde zu einem Kompilierungsfehler. Also, das problem muss etwas anderes sein.
Die common language runtime-Fehler:
java.lang.NoClassDefFoundError: code/Constants
Was ist die Lösung?
The "Constants" only contains a list of constant variables.
, Das heißt der Constant Interface anti pattern 🙂- Und, was genau ist eine "Konstante variable"? 😉
- eine variable, wo die javaDoc sagt Sie: HÄNDE Weg 😉
- Korrigiert habe ich es 🙂
- rollte wieder den tag verpasst - ich war ziemlich verwirrt von einem Ihrer Kommentare, dachte TOR war irgendwie eine andere Sprache, verwendet die java-byte-code (wie scala oder so). Jetzt weiß ich, dass es nur ein java-framework für nlp. Und es hat eine main-Methode!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überprüfen Sie die statische Initialisierung dieser Klasse. Schau mal hier: was ist der Unterschied zwischen NoClassDefFoundError und ClassNotFoundException.
java.lang.NoClassDefFoundError: code/Constants
bedeutet nicht, dass die Konstanten der Klasse ist nicht im CLASSPATH. In der Tat ist das Gegenteil der Fall. Es bedeutet, dass die Klasse gefunden wurde, indem der ClassLoader, jedoch beim laden der Klasse, kam es zu einem Fehler beim Lesen der definition der Klasse. Dies geschieht normalerweise, wenn der betreffenden Klasse hat statische Blöcke oder Elemente, die eine Klasse verwenden, die nicht gefunden wird, indem der ClassLoader.Beachten, dass es zwei unterschiedliche Ausnahmen, die sehr ähnlich klingen: "ClassNotFoundException" und NoClassDefFoundError.
Die erste Ausnahme tritt in dem einfachen Fall, dass die JVM sucht "paketb.ClassA" und können es nicht finden in der Suche Weg. Es gibt ein paar andere Fälle, wie ich vermute, aber ziemlich selten.
Die zweite Ausnahme tritt meistens dann, wenn eine entsprechend benannte Klasse Datei ist gefunden, aber aus irgendeinem Grund kann es nicht verwendet werden. Es gibt zwei primäre Gründe:
Wenn Sie
somedirectory/code
in Ihrem Klassenpfad haben, dann ist das falsch. Sie immer müssen die Basis Verzeichnis in den classpath (in diesem Fall wäre essomedirectory
). Java selbst suchen, werden diese Wurzeln für ein Verzeichnis namenscode
enthält eine Datei namensConstants.class
.Könnten Sie es in Ihrem CLASSPATH beim kompilieren aber dies bedeutet nicht garantieren, dass es in der Umgebungsvariable CLASSPATH, wenn Sie es ausführen. Wie betreibst du es?
java -cp /.../code-misc.jar:/.../MultiDoc.jar my.application.Main
Aus deiner Frage sehe ich, dass die kompilierten
Constants
- Schnittstelle befindet sich in einer jar-Datei, die unterscheidet sich von der Glas/Lage des implementierenden Klassen. So sollten Sie in der Lage zu führen Sie die Anwendung wie diese:(ersetzen Sie die Namen mit Ihrem echten Namen)
Wenn, die Sie Hinzugefügt haben die anderen Klassen ein anderes jar und dann, wenn Sie gemacht, die ausführbare jar-und dann, wenn Sie versuchte es mit
java -jar MyApplication.jar
, dann jeder der Klassenpfad definiert, die außerhalb der jar ausgeführt wird ignoriert. Aber der obige Befehl sollte funktionieren mit jedem jar (executable oder nicht).Kommentar
Die Sie nennen, ist definitiv falsch. Tun Sie es wie folgt aus (UPDATE):
java
dann sind Sie brauchen eine Klasse, die eine main-Methode. Vielleicht ist das GATE-framework enthält eine Klasse mit einer main-Methode und Ihr Beitrag/plugin bietet, dassexecute()
Methode. Glauben Sie mir, es ist einmain
Methode irgendwo. Untersuchen Sie dieMANIFEST.MF
Datei inMultiDoc.jar
sollte es einen Zeiger.Jeder Schnittstelle müssen deklariert innerhalb der Klasse.
*Ich habe sehr lange finden der Lösung dieses Problems, aber ich finde die Auflösung unabhängig von der Methode der wissenschaftlichen Stossen