クラスパスの設定は、JDK ツールに-classpath
オプションを付ける方法 (この方法が望ましい) か、CLASSPATH 環境変数を設定する方法により行います。% jdkTool -classpath path1:path2... % setenv CLASSPATH path1:path2...各path
の末尾は、ファイル名かディレクトリのどちらかで、これはクラスパスを設定する対象によって異なります。複数のエントリがある場合は、コロンで区切ります。jdkTool には、
- .class ファイルを含む .zip または .jar ファイルの場合、パスは .zip または .jar ファイルの名前で終わります。
- 名前のないパッケージ内の .class ファイルの場合、パスは .class ファイルを含むディレクトリ名で終わります。
- 名前付きのパッケージ内の .class ファイルの場合、パスはルートパッケージ (絶対パスで指定されたパッケージ名の先頭パッケージ) を含むディレクトリ名で終わります。
java
、javac
、javadoc
などを指定できます。JDK ツールの一覧は、「JDK ツール」 を参照してください。
クラスパスは Java アプリケーションに対し、サードパーティ製およびユーザ定義クラス、つまり Java 拡張機能や Java プラットフォームの一部ではないクラスを探す位置を通知します。JDK 1.2 では、JVM およびその他の JDK ツールは、プラットフォームライブラリ、拡張機能ライブラリ、クラスパスをこの順序で検索することによりクラスを見つけます (検索手法の詳細は、「クラスの検索方法」を参照)。
ほとんどのアプリケーションのクラスライブラリでは、Java 拡張機能機構の利用が望まれます。これを利用することにより、(a) 現在のディレクトリまたは現在のディレクトリ内のパッケージにないクラスライブラリ、または (b) 拡張機能機構によって指定された位置にないクラスライブラリをロードする場合に、単にクラスパスを設定するだけで済みます。
旧バージョンの JDK をアップグレードする場合は、起動設定に、不要になった CLASSPATH 環境変数の設定が含まれています。このため、アプリケーションに特有でない設定は、すべて削除する必要があります。Java Virtual Machine を使うサードパーティ製アプリケーションには、使用するライブラリを取り込むために CLASSPATH 環境変数を修正するものがあります。このような設定は残しておいてもかまいません。
クラスパスの変更は、JVM や他の JDK ツールの起動時に Java ツールの -classpath オプションを使うことにより行えます (たとえば、java -classpath...)。クラスパスの変更方法としては、この方法をお勧めします。また、クラスパスは CLASSPATH 環境変数を使うことによっても変更できます。
注: JDK 1.2 のデフォルトクラスパスは、現在のディレクトリです。このデフォルトは、CLASSPATH 変数を設定したり、
-classpath
コマンド行オプションを使用したりすると無効になります。そのため、検索パスに現在のディレクトリを含める場合には、新しい設定に「.」を含める必要があります。クラスはディレクトリ (フォルダ) に保存することも、
classes.zip
やclasses.jar
などのアーカイブファイルに保存することもできます。アーカイブの詳細とクラスパスの働きについては、このドキュメントで後述する 「クラスパスとパッケージ名について」 を参照してください。
- 重要: 旧バージョンの JDK には、デフォルトのクラスパスに <jdk-dir>/classes エントリが含まれます。このディレクトリは JDK が使用するためのもので、アプリケーションクラスのために使用すべきではありません。アプリケーションクラスは JDK の外部のディレクトリに置くべきです。そうすれば、新しい JDK をインストールするときにアプリケーションのライブラリを再インストールする必要はありません。旧バージョンとの互換性を確保するため、<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:path2:...sh では、次のコマンドを使って CLASSPATH 環境変数を修正します。
CLASSPATH = path1:path2:... export CLASSPATHCLASSPATH の設定解除
CLASSPATH 環境変数に設定されている値が正しくない場合や、起動ファイルやスクリプトが不正なパスを設定している場合には、次のコマンドで csh の CLASSPATH の設定を解除することができます。
unsetenv CLASSPATHsh では、次のコマンドを使用します。
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 パッケージ内に定義されている他のクラスを検索します。
コマンドの中で完全なパッケージ名が指定されていることに注意してください。たとえば、クラスパスに
/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
ディレクトリの中を検索します。