ページ 11

[Java]リリースするとNoClassDefFoundError

Posted: 2015年9月23日(水) 16:13
by MoNoQLoREATOR
こんにちは。
jarファイルを実行するとNoClassDefFoundErrorというエラーが出てプログラムが終了してしまいます。
Eclipse上では正常に動作します。

Javaでjacksonというライブラリ(?)を使おうと試みました。

(1)このサイトに従ってjackson関係のjarファイルを3つともダウンロード(全て最新のものをダウンロード)しました。

(2)このサイトに従ってライブラリパスを3つとも追加しました。

(3)このようなコードを書きました。

コード:

package jackson_test;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class Main {

	public static void main(String[] args) {
		ObjectMapper mapper = new ObjectMapper();
		mapper.enable(SerializationFeature.INDENT_OUTPUT);
		System.out.println("hello");

	}

}
(4)Eclipse上では正常に動作しています。

(5)このような設定でjarファイルをエクスポートしました。
1.jpg
1.jpg (33.36 KiB) 閲覧数: 4109 回
2.jpg
2.jpg (18.19 KiB) 閲覧数: 4109 回
3.png
3.png (41.19 KiB) 閲覧数: 4109 回
(6)実行しようとするとこのような結果になりました。

コード:

MoNoQLoREATOR-no-MacBook-Pro:Downloads monoqloreator$ ls
UDP_server.jar			jackson-databind-2.6.0.jar
jackson-annotations-2.6.0.jar	jackson_test.jar
jackson-core-2.5.0.jar
MoNoQLoREATOR-no-MacBook-Pro:Downloads monoqloreator$ java -cp ./jackson_test.jar jackson_test.Main
Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
	at jackson_test.Main.main(Main.java:9)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper
	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:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 1 more
ちなみにjacksonを使わない場合、当然正常に動作します。

コード:

package jackson_test;

public class Main {

	public static void main(String[] args) {
		System.out.println("hello");

	}

}

コード:

MoNoQLoREATOR-no-MacBook-Pro:Downloads monoqloreator$ ls
UDP_server.jar			jackson-databind-2.6.0.jar
jackson-annotations-2.6.0.jar	jackson_test.jar
jackson-core-2.5.0.jar
MoNoQLoREATOR-no-MacBook-Pro:Downloads monoqloreator$ java -cp ./jackson_test.jar jackson_test.Main
hello

Java初心者にもわかりやすく教えていただけるとありがたいです。
よろしくお願いいたします。

Re: [Java]リリースするとNoClassDefFoundError

Posted: 2015年9月24日(木) 01:10
by MoNoQLoREATOR
自己解決しました。

jarファイルをエクスポートするときに以下のような設定でエクスポートすれば
10.jpg
10.jpg (19.35 KiB) 閲覧数: 4050 回
11.jpg
11.jpg (27.1 KiB) 閲覧数: 4050 回
このようにして実行できました。

コード:

^CMoNoQLoREATOR-no-MacBook-Pro:Downloads monoqloreator$ ls
UDP_cliant.jar		UDP_server.jar		jackson_test.jar
MoNoQLoREATOR-no-MacBook-Pro:Downloads monoqloreator$ java -jar ./jackson_test.jar
hello

Re: [Java]リリースするとNoClassDefFoundError

Posted: 2015年9月25日(金) 02:26
by YuO
MANIFEST.MFにクラスパスを含めることができるので,それで./jackson-core-2.5.0.jarなどを指定しておくとよいかと思います。

ちなみに,解決とされた方法の場合は,すべての依存jarを抱え込んだ上で,独自のエントリポイントから起動するようになるみたいです。
ref) [Java]Eclipseで実行可能JARファイルでエクスポートした時のディレクトリ構成の違い - daybreaksnow's diary