Also, ich habe den ganzen Tag mit diesem Problem verbracht.
Ich bin mir sicher, dass ich den korrekten Klassenpfad verwende.
Auch habe ich andere Pakete als Abhängigkeiten, und sie funktionieren perfekt.Java: NoClassDefFoundError: org/json/JSONException
Ich habe eine Klasse, die org.json verwendet. *
Es gibt auch einige andere äußere Pakete in dieser Klasse verwendet.
All diese Abhängigkeiten werden als JAR-Dateien in meinem/path/to/libs/abgelegt.
json-20160212.jar ist unter ihnen.
ich mit meiner Quellen bin Kompilieren geht
javac \
-cp "src/:/path/to/libs/json-20160212.jar:/path/to/libs/other.jar:/path/to/libs/another.jar" \
-d dst/ \
src/com/example/Source.java
Compilation ohne Probleme.
Dann erstelle ich Jar aus meinen Klassen-Dateien.
Manifest:
Main-Class: com.example.Source
Class-Path: /path/to/libs/json-20160212.jar
/path/to/libs/other.jar
/path/to/libs/another.jar
Befehlszeile:
jar cfm output.jar manifest -C dst/ ./com
Ich erhalte Glas mit diesem Manifest:
Manifest-Version: 1.0
Class-Path: /path/to/libs/json-20160212.jar /path/to/libs/other.jar /p
ath/to/libs/another.jar
Created-By: 1.7.0_101 (Oracle Corporation)
Main-Class: com.example.Source
Wie ich verstanden habe, das ist ok für manifest kompiliert habe geteilte Linien.
Nun, ich meine app von der Kommandozeile ausgeführt wird und diese Fehlermeldung erhalten:
Exception in thread "Thread-0" java.lang.NoClassDefFoundError: org/json/JSONException
at com.example.Source.run(Source.java:30)
Caused by: java.lang.ClassNotFoundException: org.json.JSONException
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 1 more
Wie ich weiß, das bedeutet, dass org.json.JSONException bei der Kompilierung in Ordnung war, aber zur Laufzeit fehlt .
Aber was muss ich mit dieser Info machen?
Ich habe diese Datei. Es war während der Kompilierung und zur Laufzeit an seinem Platz.
Auch gibt es andere Abhängigkeiten, und ihre Gläser sind auch an diesem Ort.
Wenn ich JSON-Nutzung aus meiner App entfernen, funktioniert alles einwandfrei.
Also kann ich Schluss machen, dass es das Paket org.json selbst ist, das das Problem macht.
Was muss ich tun, damit es funktioniert?
UPDATE
Jetzt habe ich gemacht dies ändert:
Meine Verzeichnisstruktur:
libs/
json-20160212.jar
other.jar
another.jar
src/
com/
example/
Source.java
dst/
Manifest:
Main-Class: com.example.Source
Class-Path: libs/json-20160212.jar
libs/other.jar
libs/another.jar
Compilation:
javac \
-cp "src/:libs/json-20160212.jar:libs/other.jar:libs/another.jar" \
-d dst/ \
src/com/example/Source.java
Jarchiving:
jar cfm dst/output.jar manifest -C dst/ ./com ./libs
Ich erhalte Glas mit der Struktur, wie ausgenommen:
META-INF/
META-INF/MANIFEST.MF
com/
com/example/
com/example/Source.class
libs/
libs/json-20160212.jar
libs/other.jar
libs/another.jar
Und ich bin es mit java -jar dst/output.jar
läuft.
Ergebnis ist das gleiche: java.lang.NoClassDefFoundError: org/json/JSONException
Überprüfen Sie das resultierende Glas auf seinen Inhalt. Befindet sich das JSON-Glas zum Beispiel tatsächlich in /path/to/libs/json-20160212.jar? – ManoDestra
Ich denke, Sie sind nicht spezifische lib in Ihrem Projekt hinzufügen. Überprüfen Sie es und stellen Sie sicher, dass alle benötigten Gläser alle im Projekt enthalten sind. –
Mit Ihrem Jar-Befehl oben ('jar cfm output.jar manifest -C dst /./Com') sieht es so aus, als würden Sie die Bibliotheksabhängigkeiten nicht zu Ihrem jar hinzufügen. Enthalten Sie Pfad/zu/lib sowie Ihre Klassen und es sollte danach gut funktionieren. – ManoDestra