クラスパスの設定

形式

クラスパスの設定は、SDK ツールを呼び出すときに -classpath オプションを付ける方法 (この方法が望ましい) か、CLASSPATH 環境変数を設定する方法により行います。-classpath オプションを推奨しているのは、各アプリケーションに対して個別に設定でき、ほかのアプリケーションに影響したり、ほかのアプリケーションからこの値が変更されたりすることがないためです。

% sdkTool -classpath path1:path2...

-または-

% setenv CLASSPATH path1:path2...

説明

sdkTool
コマンド行ツール (javajavacjavadoc など) です。SDK ツールの一覧は、「Java 2 SDK ツールとユーティリティ」 を参照してください。

path1:path2
.jar、.zip、または .class ファイルのパスです。各パスの末尾は、ファイル名かディレクトリのどちらかで、これはクラスパスを設定する対象によって異なります。
  • .class ファイルを含む .jar または .zip ファイルの場合、パスは .zip または .jar ファイルの名前で終わります。
  • 名前のないパッケージ内の .class ファイルの場合、パスは .class ファイルを含むディレクトリ名で終わります。
  • 名前付きのパッケージ内の .class ファイルの場合、パスはルートパッケージ (絶対パスで指定されたパッケージ名の先頭パッケージ) を含むディレクトリ名で終わります。

複数のパスエントリがある場合は、コロンで区切ります。

デフォルトのクラスパスは、現在のディレクトリです。このデフォルトは、CLASSPATH 変数を設定したり、-classpath コマンド行オプションを使用すると無効になります。 そのため、検索パスに現在のディレクトリを含める場合には、新しい設定に「.」を含める必要があります。

ディレクトリおよびアーカイブ (.zip または .jar ファイル) 以外のクラスパスエントリは、無視されます。

解説

クラスパスは SDK ツールおよび Java アプリケーションに対して、サードパーティ製およびユーザ定義のクラス、つまり拡張機能や Java プラットフォームの一部ではないクラスを探す位置を通知します。クラスパスでは、javac コンパイラでコンパイルされたすべてのクラスを検出する必要があります。 簡単に検出できるように、デフォルトはカレントディレクトリになっています。

Java 2 SDK、JVM、およびその他の SDK ツールでは、Java プラットフォーム (ブートストラップ) のクラス、拡張機能のクラス、クラスパスの順序でクラスが検索されます。検索についての詳細は、「クラスの検索方法」を参照してください。ほとんどのアプリケーションのクラスライブラリでは、Java 拡張機能機構の利用が望まれます。これを利用することにより、(a) 現在のディレクトリまたはそのサブディレクトリ内にないクラス、または (b) 拡張機能機構によって指定された位置にないクラスをロードする場合に、単にクラスパスを設定するだけで済みます。

旧バージョンの SDK ソフトウェアをアップグレードする場合は、起動設定に、不要になった CLASSPATH 環境変数の設定が含まれています。このため、classes.zip などのアプリケーション固有でない設定は、すべて削除する必要があります。Java Virtual Machine を使うサードパーティ製アプリケーションには、使用するライブラリを取り込むために CLASSPATH 環境変数を変更するものがあります。このような設定は残しておいてもかまいません。

クラスパスを変更するときは、JVM またはほかの SDK ツールを起動するときに、SDK ツールの -classpath オプションまたは CLASSPATH 環境変数を使用します。CLASSPATH 環境変数よりも -classpath オプションを使用することをお勧めします。 各アプリケーションに対して個別に設定でき、ほかのアプリケーションに影響したり、ほかのアプリケーションからこの値が変更されたりすることがないためです。

クラスは、ディレクトリ (フォルダ) またはアーカイブファイルに格納できます。Java プラットフォームのクラスは、rt.jar に格納されています。アーカイブの詳細およびクラスパスの機能については、「クラスパスとパッケージ名」を参照してください。

重要: 旧バージョンの SDK のソフトウェアには、デフォルトのクラスパスに <jdk-dir>/classes エントリが含まれているものがあります。このディレクトリは SDK ソフトウェアが使用するためのもので、アプリケーションクラスのために使用すべきではありません。アプリケーションクラスは、SDK ディレクトリ階層の外部のディレクトリに置くべきです。そうすれば、新しい開発環境をインストールするときにアプリケーションのクラスを再インストールする必要はありません。旧バージョンとの互換性を確保するため、<jdk-dir>/classes ディレクトリをクラスライブラリとして使用するアプリケーションは、現在のバージョンでは実行できます。

SDK ツールの -classpath オプションの使用

Java ツール javajdbjavacjavah には -classpath オプションがあります。 このオプションはツールの実行中、CLASSPATH 環境変数によって指定された 1 つまたは複数のパスを別のパスに置き換えます。クラスパスの設定を変更する方法としては、この方法をお勧めします。 その理由は、アプリケーションが他のアプリケーションに影響を与えずに、自分に必要なクラスパスを持つことができるからです。

実行時ツール javajdb には -cp オプションがあります。このオプションは、-classpath の省略形です。

ごく特殊なケースのために、javajavac には、ツール自体のクラスライブラリ検索用パスを変更するためのオプションがあります。しかし、ほとんどのユーザはこのオプションを使う必要はありません。

CLASSPATH 環境変数の使用

前述したように、クラスパスの変更には通常、-classpath コマンド行オプションを使用します。ここでは、CLASSPATH 環境変数の設定が必要な場合に、それを行う方法と、旧バージョンのインストール時から残っている設定を解除する方法を説明します。

CLASSPATH の設定

csh では、setenv コマンドを使って CLASSPATH 環境変数を修正します。コマンドの形式は、次のとおりです。

setenv CLASSPATH path1:path2

sh では、次のコマンドを使って CLASSPATH 環境変数を修正します。

CLASSPATH = path1:path2:...
export CLASSPATH

CLASSPATH の設定解除

CLASSPATH 環境変数に設定されている値が正しくない場合や、起動ファイルやスクリプトが不正なパスを設定している場合には、次のコマンドで csh の CLASSPATH の設定を解除することができます。

unsetenv CLASSPATH

sh では、次のコマンドを使用します。

unset CLASSPATH

これらのコマンドは、現在のシェルに対してだけ CLASSPATH の設定を解除します。次回以降のセッションでも正しい CLASSPATH の設定を保持するには、起動設定を削除または修正する必要があります。

起動設定の変更

CLASSPATH 環境変数がシステムの起動時に設定される場合は、変更方法は実行中のシェルによって異なります。

シェル 起動スクリプト
csh、tcsh .cshrc ファイル内の setenv コマンドが記述されている箇所を探す
sh、ksh .profile ファイル内の export コマンドが記述されている箇所を探す

クラスパスとパッケージ名 クラスパスとパッケージ名

Java のクラスはパッケージ内に整理されており、パッケージはファイルシステム内のディレクトリに割り当てられています。しかし、ファイルシステムとは異なり、パッケージ名を指定するときは必ずパッケージ名の一部ではなく全体を指定します。たとえば、java.awt.Button のパッケージ名には、必ず java.awt と指定する必要があります。

たとえば、Java Runtime が utility.myapp パッケージ内の Cool.class という名前のクラスを探すように設定する場合を考えてみます。そのディレクトリへのパスが /java/MyClasses/utility/myapp であれば、/java/MyClasses を含むようにクラスパスを設定します。

このアプリケーションを実行するには、次の JVM コマンドを使用できます。

% java -classpath /java/MyClasses utility.myapp.Cool

アプリケーションを実行すると、JVM はクラスパスの設定を使って、utility.myapp パッケージ内に定義されている、 Cool クラスが使用する他のクラスを検索します。

コマンドの中で完全なパッケージ名が指定されていることに注意してください。たとえば、クラスパスに /java/MyClasses/utility を含めて設定し、コマンド java myapp.Cool を使用することはできません。実行しても、クラスを見つけることはできません。

実行しても、クラスを見つけることはできないからです。クラスのパッケージ名はクラスの一部なので、クラスをコンパイルし直さない限り変更できません。

注: パッケージ指定のメカニズムでは、「あるパッケージの一部であるファイルが、実際には別のディレクトリに存在する」ことがあります。この場合、各クラスのパッケージ名は同じになりますが、それぞれのファイルへのパスは、クラスパス内の別々のディレクトリで始まります。

フォルダとアーカイブファイル

クラスが /java/MyClasses/utility/myapp のようなディレクトリ (フォルダ) に格納されている場合、そのクラスパスのエントリはパッケージ名の先頭の要素が格納されているディレクトリを指します。この場合は、パッケージ名が utility.myapp なので /java/MyClasses を指します。

しかしクラスがアーカイブファイル (.zip ファイルまたは .jar ファイル) 内に格納されている場合、クラスパスのエントリは .zip ファイルまたは .jar ファイルへのパスとなり、これらのファイルを含んでいます。たとえば、.jar ファイル内のクラスライブラリを使用するには、次のようなコマンドを使用します。

% java -classpath /java/MyClasses/myclasses.jar utility.myapp.Cool

複数指定

ディレクトリ /java/MyClasses の中のクラスと /java/OtherClasses の中のクラスを検索するには、クラスパスを次のように設定します。

% java -classpath /java/MyClasses:/java/OtherClasses ...

2 つのパスをコロンで区切ることに注意してください。

指定の順序

複数のクラスパスエントリを指定する順序は重要です。Java インタプリタは、クラスパス変数に指定されている順にディレクトリを調べてクラスを探します。上の例では、Java インタプリタは最初に /java/MyClasses ディレクトリ内で必要なクラスを探します。このディレクトリ内に該当するクラス名が見つからなかった場合にだけ、インタプリタは /java/OtherClasses ディレクトリの中を検索します。