コントロールパネルでシステム環境変数のCLASSPATHにclassファイルを置いてある場所を指定してあります。コンパイルや、コマンドでの実行はできますが、jarファイルを作ると一緒に入れてくれなくて、実行時にNoClassDefFoundErrorが出ます。
自動で入れてくれるように設定できますか?
jar cvfm Sample.jar s.mf *.class でやってます。
追記:
ダウンロードしたパッケージは使ってません(使ったことがありません)。
作ったclassファイルをフォルダにおいて、フォルダをクラスパスに設定してあります。
s.mfの中身は、
Main-Class: Sample
の1行と改行1つだけです。
今までは、jarを作る度に一緒に入れるクラスファイルをプロジェクトのフォルダにコピーして、*.classでいっぺんに入れていましたが、今日org.apache.commons.lang3.math.NumberUtilsをダウンロードして使ってみたらその方法ではパッケージがなんとかってエラーが出て失敗しました。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
まず、自分が作ったjarと、外部提供jarを使用する場合について書きます。
おそらく、現在は次のようなコマンドで実行していると思います。
> java -jar Sample.jar
しかし、-jar
オプションをつけた場合、(環境変数や-cp
,-classpath
オプションで設定した)クラスパス設定は無視されます。
- Java: -jar と -classpath は併用できない - sardineの日記
オフィシャルのドキュメントでは、次の箇所が該当しますね。(該当Java8ドキュメントは日本語化されていないようですが)
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html:
When you use the -jar option, the specified JAR file is the source of all user classes, and other class path settings are ignored.
https://docs.oracle.com/javase/jp/6/technotes/tools/windows/java.html
このオプションを使用すると、指定した JAR ファイルがすべてのユーザークラスのソースになり、ユーザークラスパスのほかの設定は無視されます。
というわけで、-jar
オプションを使わずに実行するようにすればクラスパス設定は効きます。
> java -cp Sample.jar;commons-lang3-3.4.jar Sample
クラスパスに自分で作ったjarと外部製のjarを両方指定し、かつ、(マニフェストファイルのメインクラス記述を利用できないので)明示的に実行するクラスを指定してあげる方法です。
次に、上記の方法ではちょっとコマンドが煩雑なので、マニフェストファイルを利用して簡略化します。
マニフェストファイル(s.mf
)の内容を以下のようにしてください。
Main-Class: Sample
Class-Path: commons-lang3-3.4.jar
そして、いつもどおりjar
を作成します。
> jar cvfm Sample.jar s.mf *.class
これで、カレントディレクトリにSample.jar
とcommons-lang3-3.4.jar
を置いておけば、従来通り次のコマンドで実行できるようになります。
> java -jar Sample.jar
勘違いされていると思うのでここで繰り返しておきますが、-jar
オプションを指定した場合、環境変数CLASSPATH
に設定した内容は無視されます。
今org.apache.commons.lang3.math.NumberUtils
が参照できているのは、マニフェストファイルにクラスパス設定を行っているからです。
上記の方法だと、jarファイルが2つになって、やはりちょっと煩雑です。これをひとつにまとめたい…となると、一旦commons-lang3-3.4.jar
を解凍し、自分の作成したクラスと統合した上でjarを作る必要が出てきます。
その作業を自動化してくれるツールがmaven assembly pluginなどです。
(1ファイル化されたjarのことを、Fat-Jarと呼んだりUber-Jarと呼んだりするようですので、興味があればこれらの単語で検索してみてください)。
(補足)
私は、jarで提供されているものはjarのまま使用したほうが良いと思います。
例えば、今回のNumberUtilsのソースはこちらになりますが、
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
とある通り、このクラスは単独では動かず、別のクラスファイルも必要になります(そしてこれらのクラスもまた別のクラスを要求しているかもしれないわけです)。
これらをいちいち考えながら使用するのは面倒すぎます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
実行する際に、Commons-Langライブラリーをクラスパスに通すのは無し、という前提で回答します。
...
外部のJarを、自動的に今作ろうとしているJarに含めることは、Jarコマンドではできません。
自動的に混ぜてくれるツールは、例えばMavenのassemblyプラグインなどがありますが、Mavenを導入する必要があるので少し難しいかもしれません。
一番簡単なのは、外部のJarをばらして(クラスファイルを取り出して)、クラスパスフォルダーにまぜてしまうことです。
ただし、どちらの方法でも外部のライブラリーの再配布になり、ライセンス(下記リンク参照)が関係してきますので、そこはご注意ください。
Apache License - Wikipedia
https://ja.wikipedia.org/wiki/Apache_License
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
退会済みユーザー
2015/12/21 21:21
パッケージ構成がどうなっているのか気になります。マニフェストファイル(s.mf)の中身(特にMain-Classがどう記述されているのか)と、具体的なクラス名(パッケージ名含む)がどんなものか追記することは可能でしょうか。