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.class と library/Hello.class が生成され、java Main で Hello! と表示され、期待通りの動作をします。
次に、パッケージ 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.class と library.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 コメント