🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

2回答

19633閲覧

環境変数を設定していても、jarファイルを作ったときにクラスファイルが入りません。

otftrough

総合スコア476

Java

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2015/12/21 09:25

編集2015/12/22 04:17

コントロールパネルでシステム環境変数の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をダウンロードして使ってみたらその方法ではパッケージがなんとかってエラーが出て失敗しました。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2015/12/21 12:21

パッケージ構成がどうなっているのか気になります。マニフェストファイル(s.mf)の中身(特にMain-Classがどう記述されているのか)と、具体的なクラス名(パッケージ名含む)がどんなものか追記することは可能でしょうか。
guest

回答2

0

ベストアンサー

まず、自分が作ったjarと、外部提供jarを使用する場合について書きます。
おそらく、現在は次のようなコマンドで実行していると思います。

> java -jar Sample.jar

しかし、-jarオプションをつけた場合、(環境変数や-cp,-classpathオプションで設定した)クラスパス設定は無視されます。

オフィシャルのドキュメントでは、次の箇所が該当しますね。(該当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.jarcommons-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;

とある通り、このクラスは単独では動かず、別のクラスファイルも必要になります(そしてこれらのクラスもまた別のクラスを要求しているかもしれないわけです)。
これらをいちいち考えながら使用するのは面倒すぎます。

投稿2015/12/22 06:33

編集2015/12/22 06:49
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

otftrough

2015/12/22 07:32

ありがとうございます。
guest

0

実行する際に、Commons-Langライブラリーをクラスパスに通すのは無し、という前提で回答します。

...

外部のJarを、自動的に今作ろうとしているJarに含めることは、Jarコマンドではできません。

自動的に混ぜてくれるツールは、例えばMavenのassemblyプラグインなどがありますが、Mavenを導入する必要があるので少し難しいかもしれません。

一番簡単なのは、外部のJarをばらして(クラスファイルを取り出して)、クラスパスフォルダーにまぜてしまうことです。
ただし、どちらの方法でも外部のライブラリーの再配布になり、ライセンス(下記リンク参照)が関係してきますので、そこはご注意ください。

Apache License - Wikipedia
https://ja.wikipedia.org/wiki/Apache_License

投稿2015/12/21 10:03

編集2015/12/22 05:15
argius

総合スコア9394

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

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

otftrough

2015/12/22 04:03

質問文でのタイプミスです。
otftrough

2015/12/22 07:32

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問