CLASSPATH

Revised: May/21st/2005: Since: Jan./1st/2002

本稿ではここまで、クラスパスの設定はしないという前提で説明してきました。クラスパスを設定しない場合、JVM がクラスを探索する基準ディレクトリは、自動的にカレント・ディレクトリになります。

クラスパスの指定方法

サードベンダーのパッケージを利用する場合や、本格的にアプリケーション開発に臨むならば、システムの CLASSPATH 変数のセットは不可欠な手順です。そうすれば、パッケージ名もディレクトリの相対パス情報ではなく、絶対的な一意的識別子として便利に利用できるようになります。

CLASSPATH 変数の設定方法は、プラットフォームによって変わります。 Linux, Win9X, WinNT ではそれぞれ設定の仕方が異なります。 詳細は、Sun Microsystems の公開している文書など確認してください:

SDK 1.4 のドキュメント

JDK 1.5 (5.0) のドキュメント

クラスパスを指定するときの注意点

一般的な注意点として、次の二点が挙げられます:

カレントディレクトリ
明示的にクラスパスをセットすると、カレントディレクトリ "." を明示的に指定しておかないと、自動的には設定されなくなります。カレントディレクトリに存在する HelloWorld が実行できなくなったなどの場合は、クラスパスにカレントディレクトリが明示的に指定されているか確認してください。
優先順序
CLASSPATH の先頭に記述したものの方が実行時の優先度が高いことになります。デバッグ時など、修正が反映されていないと思ったら、クラスパスの順序を確認してみてください。

CLASSPATH を環境変数で指定すると、 Java ツールだけではなく、他のツールからも一般に利用できるようになります。これでは少し危険なので、 Java ツールだけから参照するようにセットすることも出来ます。そのためには、コマンドラインツールにオプション -classpath をつけて実行します。

>java -classpath .;C:\Java 実行クラス名

この例では、 Java インタープリタ java がクラスファイルを探すときに、最初にカレントディレクトリを探し、無ければ次に C:\Java を探すように設定しています。

本稿では CLASSPATH はセットしない方針で解説していますが、カレントディレクトリが先頭に来ている CLASSPATH ならば、セットしてあっても同じように動作します。

パッケージとクラスパス

クラスパスには、ファイルシステムの絶対パスを指定します。このパスは、JVM がクラス名を完全限定名に解決するための起点となるパスです。

クラスパスなし、パッケージなし

何も指定しない場合は、自動的にカレント・ディレクトリが指定されます。HelloWorld のように、明示的にパッケージに属さないクラスは、自動的にカレントディレクトリに属することになるので、カレントディレクトリ直下のクラスとして解決され、実行されます。

パッケージあり

明示的にパッケージに属する場合は、パッケージ名をカレントディレクトリ配下のサブ・ディレクトリとして解釈して探索します。例えば、パッケージ "demo.myPackage" に属するクラス "MyClass" は、カレント・ディレクトリ配下の "./demo/myPackage/MyClass.class" として探索されます。

クラスパスあり

明示的にクラスパスがセットされた場合は、カレント・ディレクトリが、指定されたパスに置き換えられます。複数セットされている場合は、先頭から順番に探していき、最初に見つけたものをロードします。

JAR ファイルの場合

JAR ファイルの場合は、内部にサブディレクトリを持っているので、クラスパスにセットするのは、JAR ファイルの絶対パスになります。例えば、"demoJar.jar" が、ディレクトリ "demo/myPackage" を JAR 圧縮して作られているとき、"demoJar.jar" の絶対パスをクラスパスにセットします。JVM は、クラスの探索経路に、"demoJar.jar" を追加し、内部の "demo/myPackage" 内部に存在するクラスを探査できるようになります。

オプション・パッケージ

JVM のクラスローダは、ユーザが明示的に指定するクラスパスの前に、システムで利用するディレクトリを先に探索します。例えば、java.lang などのコア・パッケージが含まれる rt.jar などがその例です。

アプリケーションから共通して呼ばれる環境的なパッケージ(XML パーサや JDBC ドライバなど)は、ユーザ定義のクラスパスではなく、オプションパッケージ (Optional packages) として配備するのが普通です。オプションパッケージは、Java 拡張機能機構 (Extension Mechanism Architecture) で提供されるパッケージで、Java プラットフォームを拡張する API として位置づけられます。



Copyright © 2002-2005 SUGAI, Manabu. All Rights Reserved.
SEO [PR] !uO z[y[WJ Cu