質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

2731閲覧

Jarファイルにすると、実行できなくなります。

otftrough

総合スコア476

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/12/28 16:23

普段、コマンドプロンプトやバッチファイルでコンパイル・実行しています。
今までと同じようにJarファイルを作ったのに、エラーがでます。

Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.NoClassDefFoundError: twitter4j/TwitterException at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Unknown Source) at java.lang.Class.privateGetMethodRecursive(Unknown Source) at java.lang.Class.getMethod0(Unknown Source) at java.lang.Class.getMethod(Unknown Source) at sun.launcher.LauncherHelper.validateMainClass(Unknown Source) at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) Caused by: java.lang.ClassNotFoundException: twitter4j.TwitterException at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 7 more

上記のエラー文は、java -jar xxx.jarで実行しようとした時に表示されたものです。
パソコンの設定がおかしいのかと思いましたが、以前作ったものらは、再度コンパイルしてJarにしてもちゃんと実行できてしまいます。
javaコマンドで実行すると正常に動くので、コードの問題ではないと思うんですが、なにが原因でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

javaコマンドで実行する場合、-jarと-cpを両方しているのではないでしょうか?-jarを指定する場合はユーザー指定の-cpは無効になります。

例:

text

1// T.java 2import a.A; 3class T { 4 public static void main(String[] args) { 5 new A().method(); 6 } 7} 8 9// a/A.java 10package a; 11public class A { 12 public void method() { System.out.println("method invoked"); } 13} 14 15// meta.mf 16Manifest-Version: 1.0 17Main-Class: T

bash

1$ java -cp . T 2method is invoked 3$ jar cvmf meta.mf t.jar T.class 4マニフェストが追加されました 5T.classを追加中です(=300)(=233)(22%収縮されました) 6$ java -jar t.jar -cp . 7Exception in thread "main" java.lang.NoClassDefFoundError: a/A 8 at T.main(T.java:5) 9...

どうするかというとマニフェストファイル上にクラスパスを明記するのが通常の方法と思います。

text

1// meta.mf 2Manifest-Version: 1.0 3Main-Class: T 4Class-Path: . 5

bash

1$ jar cvmf meta.mf t.jar T.class 2... 3$ jar tvf t.jar 4 0 Fri Dec 29 03:34:58 JST 2017 META-INF/ 5 95 Fri Dec 29 03:34:58 JST 2017 META-INF/MANIFEST.MF 6 300 Fri Dec 29 03:08:10 JST 2017 T.class 7$ ls a 8A.class A.java 9$ java -jar t.jar 10method is invoked 11$ cd a 12$ java -jar ../t.jar 13method is invoked 14$ cp ../t.jar . 15$ jar -jar t.jar 16Exception in thread "main" java.lang.NoClassDefFoundError: a/A 17...

上記に着目していただくとjavaで-cp .を指定する場合と若干意味が異なっていることが伺えると思います。マニフェストファイルにClass-Path: .と記述した場合の意味は「jarファイルがある場所からの相対位置」という意味になり、javaコマンドをどの作業ディレクトリーで起動したかには関係しません。

自前のプログラムとそれが依存するjarがある場合、

  1. マニフェストファイルに指定したとおりの位置に依存jarを置いた状態で実行する
  2. 依存ライブラリーを自前のjarに全て含める

の2つの方法があると思います。

IDEでjarを生成する際は上記のどちらでも簡単な指定でできるようになっていたりしますが、jarコマンドで直接生成する場合は相対位置に注意しつつ1.の方法を採る方がjarの生成が簡単であるように思います。2.をやろうとすると依存ライブラリーを自前のクラスファイルの在処と同じ場所に一旦展開してからそれら全てをjarへ登録するような方法になるでしょうから若干面倒ですね・・・


余談:
かつてEclipseで提供されていたパッケージング機能では自前のjarの中に依存ファイルのjarファイルを(展開せずにjarファイルのまま)含めるようなことができたと思いますが、IDEによってはそういう生成方法をサポートしていないのであまりやらない方がいいかも。(少なくともIntelliJや現在のEclipseで簡単にそれを行う方法はないようです)
===>訂正:Eclipse Neonであれば簡単にできるとのことです。(ご指摘ありがとうございました。>umyuさん)

投稿2017/12/28 19:06

編集2017/12/29 01:04
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

umyu

2017/12/28 19:36

余談の方ですが、eclipse(Eclipse Neon3)ではエクスポート→実行可能Jarファイル→必須ライブラリを生成されるJarにパッケージでそのまま格納できます。
KSwordOfHaste

2017/12/29 01:05 編集

ご指摘ありがとうございます! Java9のmoduleサポートでall in oneでないものも使い勝手が改善したとはいえall in oneの手軽さは利用者にはありがたいだろうと思います。IntelliJ 2017(Communication Edion)時点では少なくとも簡単にはできなさそうなので、その点NeonとかOxygenはいいですね。
otftrough

2017/12/29 00:16

うまくいきました。 わかりやすい説明ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問