Java で書いたプログラムを実行する際のクラスパスの指定について

Java の仕組みを理解するために、Java のパッケージを JAR ファイル化し、それを読み込んで使う Java プログラムを書こうとしています。それを、Java の基本的なコマンドだけ(高度なビルドツールを使わずに)を用いて、やろうとしています。

まず以下のようなファイル構成で、

. ├── Main.java └── library └── Hello.java

java

// library/Hello.java package library; public class Hello { public static void hello() { System.out.println("Hello!"); }}

java

// Main.java import library.Hello; public class Main { public static void main(String[] args) { Hello.hello(); }}

javac Main.java とすると、Main.classlibrary/Hello.class が生成され、java MainHello! と表示され、期待通りの動作をします。

次に、パッケージ library を JAR ファイル化するために、

sh

$ jar cvf library.jar library/Hello.class マニフェストが追加されました library/Hello.classを追加中です(入=394)(出=278)(29%収縮されました)

として、library.jar を作成します。これを使って実行するために、

sh

$ javac -cp library.jar Main.java

として、クラスパスを指定してコンパイルし、すでにある library ディレクトリなどを参照しないように別のディレクトリに Main.classlibrary.jar をコピーして下記のようにします。

sh

$ tree . ├── Main.class └── library.jar 0 directories, 2 files

このディレクトリで、library.jar をクラスパスとして指定しながら実行すると、

sh

$ java -cp library.jar Main エラー: メイン・クラスMainを検出およびロードできませんでした 原因: java.lang.ClassNotFoundException: Main

となってしまいます。この原因が分かりません。
また、

sh

$ java -cp .:library.jar Main Hello! $ java -cp Main.class:library.jar Main エラー: メイン・クラスMainを検出およびロードできませんでした 原因: java.lang.ClassNotFoundException: Main

となるのですが、なぜなのかが分かりません。クラスパスとして参照するものは library.jar だけに思えるのですが、そうではなく、また、Main.class でもないということだと思うのですが、. を追加すると実行できる理由が分かりません。

コメントを投稿

0 コメント