クラスパスの設定は、SDK ツールを呼び出すときに-classpath
オプションを付ける方法 (この方法が望ましい) か、CLASSPATH
環境変数を設定する方法により行います。-classpath
オプションを推奨しているのは、各アプリケーションに対して個別に設定でき、ほかのアプリケーションに影響したり、ほかのアプリケーションからこの値が変更されたりすることがないためです。
%
sdkTool-classpath
path1:
path2...-または-
% setenv CLASSPATH
path1:
path2...説明
- sdkTool
- コマンド行ツール (
java
、javac
、javadoc
など) です。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
ディレクトリをクラスライブラリとして使用するアプリケーションは、現在のバージョンでは実行できます。
Java ツール java、jdb、javac、javah には
-classpath
オプションがあります。 このオプションはツールの実行中、CLASSPATH
環境変数によって指定された 1 つまたは複数のパスを別のパスに置き換えます。クラスパスの設定を変更する方法としては、この方法をお勧めします。 その理由は、アプリケーションが他のアプリケーションに影響を与えずに、自分に必要なクラスパスを持つことができるからです。実行時ツール java と jdb には
-cp
オプションがあります。このオプションは、-classpath
の省略形です。ごく特殊なケースのために、java と javac には、ツール自体のクラスライブラリ検索用パスを変更するためのオプションがあります。しかし、ほとんどのユーザはこのオプションを使う必要はありません。
前述したように、クラスパスの変更には通常、
-classpath
コマンド行オプションを使用します。ここでは、CLASSPATH
環境変数の設定が必要な場合に、それを行う方法と、旧バージョンのインストール時から残っている設定を解除する方法を説明します。CLASSPATH の設定
csh では、
setenv
コマンドを使ってCLASSPATH
環境変数を修正します。コマンドの形式は、次のとおりです。
setenv CLASSPATH
path1:
path2sh では、次のコマンドを使って
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
ディレクトリの中を検索します。