私はこの問題で一日中過ごしました。
私は正しいクラスパスを使用していると確信しています。
また、他のパッケージも依存関係にあり、完全に動作します。Java:NoClassDefFoundError:org/json/JSONException
私はorg.jsonを使用するクラスを持っています*
また、このクラスで使用されるいくつかの外部パッケージがあります。
この依存関係はすべて、my/path/to/libs /にjarファイルとして格納されます。
json-20160212.jarがその中にあります。
私は
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
コンパイルは問題なく行くと私のソースをコンパイルしています。
次に、クラスファイルからjarファイルを作成しています。
マニフェスト:
Main-Class: com.example.Source
Class-Path: /path/to/libs/json-20160212.jar
/path/to/libs/other.jar
/path/to/libs/another.jar
コマンドライン:
jar cfm output.jar manifest -C dst/ ./com
私はこのマニフェストでjarファイルになっています:へのマニフェストコンパイルのために私は理解してきたように
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
は、これはokです分割線があります。今
、私はコマンドラインから私のアプリを実行すると、このエラーを取得しています:
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
私が知っているように、それは意味し、org.json.JSONExceptionは、コンパイル時にOKが、実行時に欠落していました。
この情報はどうすればよいですか?
私はそのファイルを持っています。コンパイル中と実行時に、その場所にありました。
また、他の依存関係もあり、その瓶もその場所にあります。
アプリからJSONの使用状況を削除すると、すべて正常に機能しています。
したがって、私は結論を下すことができます。パッケージorg.json自体であり、問題を引き起こします。
私はそれを機能させるために何をしなければなりませんか?
私のディレクトリ構造を:
libs/
json-20160212.jar
other.jar
another.jar
src/
com/
example/
Source.java
dst/
マニフェスト:さて、私はこれが変わる作った
UPDATE
Main-Class: com.example.Source
Class-Path: libs/json-20160212.jar
libs/other.jar
libs/another.jar
編集:
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
私は除外されるような構造でjarファイルを取得しています:
META-INF/
META-INF/MANIFEST.MF
com/
com/example/
com/example/Source.class
libs/
libs/json-20160212.jar
libs/other.jar
libs/another.jar
そして私はjava -jar dst/output.jar
でそれを実行していますよ。
結果は同じです:java.lang.NoClassDefFoundError: org/json/JSONException
結果のjarファイルの内容を確認してください。 JSON jarは実際には/path/to/libs/json-20160212.jarにありますか? – ManoDestra
私はあなたのプロジェクトに特定のlibを追加していないと思います。それを確認し、必要なすべてのjarファイルがすべてプロジェクトに正しく含まれていることを確認してください。 –
上記のjarコマンド( 'jar cfm output.jar manifest -C dst /。/ com')を実行すると、ライブラリの依存関係をjarファイルに追加していないように見えます。あなたのクラスだけでなく、パス/ to/libも含めてください。それ以降はうまくいくはずです。 – ManoDestra