2016-04-12 3 views
1

Ich habe eine GUI-Anwendung, die mit Swing und einer Graphikbibliothek eines Drittanbieters namens GraphStream (es gibt 2 JARs) erstellt wurde. Dies ist wahrscheinlich ein Klassenpfadproblem und unabhängig von der Bibliothek selbst.Konnte Java GUI nicht sporadisch vom Befehl ausführen

Wenn ich von Eclipse starte, erscheint die GUI und es gibt keine Fehler/Warnungen.

Wenn ich jedoch versuche, über die Befehlszeile auszuführen, erhalte ich entweder NoClassDefFoundError, oder die Anwendung wird ausgeführt und bleibt beim Laden der Bibliotheken unbegrenzt hängen. Dies scheint völlig sporadisch zu sein. Manchmal wird der Fehler gedruckt, und manchmal hängt die JVM einfach. Dies ist, wie ich bin mit der Anwendung:

java -verbose -classpath '../lib;.' -cp . bt_sim <args> 

Die beiden JAR-Dateien sind in der „../lib“ Verzeichnis (und das sind die einzigen zwei Dateien in diesem Verzeichnis). Außerdem sind die Klassen, die ich geschrieben habe, in "." - Wenn ein Fehler tatsächlich angehoben wird, dann ist dies die Ausgabe:

... Other loading output from JVM debug ... 
[Loaded java.util.IdentityHashMap$KeySet from C:\Program Files\Java\jre8\lib\rt.jar] 
java.lang.NoClassDefFoundError: org/graphstream/graph/Graph 
    at bt_sim.main(bt_sim.java:70) 
Caused by: java.lang.ClassNotFoundException: org.graphstream.graph.Graph 
    at java.net.URLClassLoader$1.run(Unknown Source) 

Und wenn die Anwendung hängt:

... 
[Loaded java.util.Formatter$Flags from C:\Program Files\Java\jre8\lib\rt.jar] 
[Loaded java.util.Formatter$Conversion from C:\Program Files\Java\jre8\lib\rt.jar] 
[Loaded sun.misc.Cleaner from C:\Program Files\Java\jre8\lib\rt.jar] 

Der gleiche Fehler auftritt, auch wenn ich von einer Linux-Umgebung ausgeführt werden. In allen Fällen laufe ich mit JRE 8. In Eclipse und bei der Ausführung über die Befehlszeile sind nur ZWEI JAR-Dateien enthalten (Graphikabhängigkeiten des Drittanbieters). Die JAR-Dateien befinden sich in meinem obigen Befehl im Verzeichnis "lib". Irgendwelche Ideen, was zu untersuchen wäre super hilfreich!

meine Lösung Ich wusste nicht, dass ich ausdrücklich jedes Dritt JAR auf dem Classpath enthalten musste. Nachdem ich dies tat, ausgeführt die Anwendung als erwartet: -/

+0

Kudos für die Verwendung von '-verbose', um die Diagnose zu führen. – trashgod

Antwort

1

Beachten Sie, dass -classpath und -cp Aliase sind:

$ java -help 
    … 
    -cp <class search path of directories and zip/jar files> 
    -classpath <class search path of directories and zip/jar files> 
        A : separated list of directories, JAR archives, 
        and ZIP archives to search for class files. 

Ich vermute, dass das eine das andere überschreibt, wenn sie zusammen verwendet werden. Verwenden Sie stattdessen die form, die das erforderliche Verzeichnis- und Pfadtrennzeichen lib für Ihre Plattform enthält.

+0

Ja - Entschuldigung, ich habe den falschen Codeschnipsel kopiert/eingefügt. Aber ich werde den Kredit an Sie weitergeben, weil ich dadurch auf einen Link stieß, der mir klar machte, dass ich die eigentliche JAR-Datei von Drittanbietern auf den Klassenpfad setzen muss! Ich arbeite nicht viel mit Java (meistens C++), aber ich dachte, dass das Bereitstellen eines Verzeichnisses ausreichend ist. Vielleicht gibt es ein Benennungsschema, dem die JAR folgen muss, dem ich nicht gefolgt bin ... Aber sobald ich den tatsächlichen Pfad zu den 2 JAR-Dateien auf dem CP gesetzt habe, funktioniert es. Danke für die Antwort. – Jmoney38

+0

Ausgezeichnet; Ich bin froh, dass du es sortiert hast. Sie können [Ihre eigene Frage beantworten] (http://meta.stackoverflow.com/q/17463/163188), um Ihre Frage zu aktualisieren, um zu zeigen, was funktioniert hat. Einige damit verbundene Fallstricke werden [hier] untersucht (http://stackoverflow.com/search?tab=votes&q=user%3a230513%20java.ext.dirs). – trashgod