![]() | Documentation Contents |
クラスパスは、Java 実行環境がクラスおよび他のソースファイルを検索するパスです。クラス検索パス (「クラスパス」という短い名前が一般的) の設定は、JDK ツールを呼び出すときに
-classpathオプションを付ける方法 (推奨される方法) か、CLASSPATH環境変数を設定する方法により行います。-classpathオプションが推奨されているのは、アプリケーションごとに個別に設定できるので、ほかのアプリケーションに影響を与えたり、ほかのアプリケーションからこの値が変更されたりすることがないためです。
%sdkTool-classpathclasspath1:classpath2...-または-
% setenv CLASSPATHclasspath1:classpath2...説明
- sdkTool
- コマンド行ツール (
java、javac、javadoc、aptなど) です。JDK ツールのリストは、「JDK ツールとユーティリティー」 を参照してください。- classpath1
:classpath2- .jar、.zip、または .class ファイルへのクラスパスです。各 classpath の末尾は、ファイル名かディレクトリのどちらかです。 これは、クラスパスに何を設定するかによって異なります。
- .jar または .zip ファイル (.class ファイルを含む) の場合、クラスパスは .zip または .jar ファイルの名前で終わる
- 名前のないパッケージ内の .class ファイルの場合、クラスパスは .class ファイルを含むディレクトリの名前で終わる
- 名前付きのパッケージ内の .class ファイルの場合、クラスパスはルートパッケージ (完全指定のパッケージ名の先頭パッケージ) の入ったディレクトリの名前で終わる
複数のパスエントリを設定する場合は、コロンで区切ります。
デフォルトのクラスパスは、現在のディレクトリです。このデフォルトは、
CLASSPATH変数を設定したり、-classpathコマンド行オプションを使用したりするとオーバーライドされます。 そのため、検索パスに現在のディレクトリを含める場合には、新しい設定に「.」を含める必要があります。ディレクトリおよびアーカイブ (.zip または .jar ファイル) 以外のクラスパスエントリは、無視されます。
クラスパスは JDK ツールおよび Java アプリケーションに対して、サードパーティー製のクラスおよびユーザー定義のクラス、つまり拡張機能や Java プラットフォームの一部ではないクラスを探す位置を通知します。クラスパスでは、javac コンパイラでコンパイルしたすべてのクラスが検出される必要があります。 それらのクラスを簡単に検出できるように、デフォルトは現在のディレクトリになっています。
JDK、JVM、およびその他の JDK ツールでは、Java プラットフォーム (ブートストラップ) のクラス、拡張機能のクラス、そしてクラスパスという順序でクラスが検索されます。検索についての詳細は、「クラスの検索方法」を参照してください。ほとんどのアプリケーションのクラスライブラリでは、Java 拡張機能機構を利用しているはずです。クラスパスを設定する必要があるのは、(a) 現在のディレクトリまたはそのサブディレクトリ内にないクラスや、(b) 拡張機能機構によって指定された位置にないクラスをロードする必要がある場合だけです。
旧バージョンの JDK をアップグレードしている場合は、不要になった
CLASSPATH環境変数の設定が起動設定に含まれていることがあります。このため、classes.zipなど、アプリケーション固有ではない設定は、すべて削除する必要があります。Java 仮想マシンを使うサードパーティー製アプリケーションの中には、使用するライブラリをインクルードするためにCLASSPATH環境変数を変更するものがあります。このような設定は残しておいてもかまいません。クラスパスを変更するには、JVM またはほかの JDK ツールを起動するときに JDK ツールの -classpath オプションを使用するか、
CLASSPATH環境変数を使用します。CLASSPATH環境変数を設定するよりも、-classpathオプションを使用することをお勧めします。 アプリケーションごとに個別に設定できるので、ほかのアプリケーションに影響を与えたり、ほかのアプリケーションからこの値が変更されたりすることがないためです。クラスは、ディレクトリ (フォルダ) またはアーカイブファイルに格納できます。Java プラットフォームのクラスは、
rt.jarに格納されています。アーカイブの詳細およびクラスパスの機能については、「クラスパスとパッケージ名について」を参照してください。
- 重要: 一部の旧バージョンの JDK ソフトウェアでは、デフォルトのクラスパスに
<jdk-dir>/classesエントリが含まれています。このディレクトリは、JDK ソフトウェアが使用するためのものです。 アプリケーションのクラスのためには使用しないでください。アプリケーションのクラスは、JDK のディレクトリ階層ではない、外部のディレクトリに置いてください。そうすれば、新しい JDK をインストールしたときに、アプリケーションのクラスを再インストールする必要がなくなります。旧バージョンとの互換性を確保するため、<jdk-dir>/classesディレクトリをクラスライブラリとして使用するアプリケーションも、現在のバージョンでは実行できます。 ただし、将来のバージョンでも実行できるという保証はありません。
Java ツール java、jdb、javac、および javah には、
-classpathオプションがあります。 このオプションは、ツールの実行中に、CLASSPATH環境変数によって指定された 1 つまたは複数のパスを別のパスに置き換えます。クラスパスの設定を変更する場合は、この方法をお勧めします。 各アプリケーションが、ほかのアプリケーションに影響を与えずに、自分に必要なクラスパスを設定できるからです。実行時ツール java には、
-cpオプションもあります。このオプションは、-classpathの省略形です。ごく特殊なケースのために、java と javac には、ツール自体のクラスライブラリ検索用パスを変更するためのオプションがあります。ただし、ほとんどのユーザーはこのオプションを使う必要はありません。
前述のとおり、クラスパスを変更するには、通常、
-classpathコマンド行オプションを使用します。ここでは、必要な場合にCLASSPATH環境変数を設定する方法と、旧バージョンのインストール時から残っている設定を解除する方法を説明します。
csh では、
setenvコマンドを使ってCLASSPATH環境変数を修正します。コマンドの形式は、次のとおりです。
setenv CLASSPATHpath1:path2sh では、次のコマンドを使って
CLASSPATH環境変数を修正します。
sdkTool-classpathpath1;path2...
export CLASSPATH
CLASSPATH環境変数に設定されている値が正しくない場合や、起動ファイルやスクリプトが間違ったパスを設定している場合、csh では、次のコマンドでCLASSPATHの設定を解除できます。
unsetenv CLASSPATHsh では、次のコマンドを使用します。
unset CLASSPATHこれらのコマンドは、現在のシェルについてのみ、
CLASSPATHの設定を解除します。次回以降のセッションでもCLASSPATHが正しく設定されるようにするには、起動設定を削除または修正する必要があります。
CLASSPATH環境変数がシステムの起動時に設定されている場合、その設定場所は、実行しているシェルによって異なります。
シェル 起動スクリプト csh、tcsh .cshrcファイル内のsetenvコマンドが記述されている箇所を探すsh、ksh .profileファイル内のexportコマンドが記述されている箇所を探す
ベース名のワイルドカード文字 * を含むクラスパスエントリは、ディレクトリ内の拡張子
.jarまたは.JARを持つすべてのファイルのリストを指定したものと同等であるとみなされます。たとえば、クラスパスエントリfoo/*はfooというディレクトリ内のすべての JAR ファイルを指定します。* だけから成るクラスパスエントリは、カレントディレクトリ内のすべての JAR ファイルのリストに展開されます。ファイルは、隠されている (つまり、名前が「.」で始まる) かどうかに関係なく考慮されます。* を含むクラスパスエントリは、クラスファイルには一致しません。単一のディレクトリ
foo内でクラスファイルと JAR ファイルの両方に一致するには、foo:foo/*またはfoo/*:fooを使用します。選択された順序により、foo内のクラスおよびリソースがfoo内の JAR ファイルの前に (またはその逆で) ロードされるかどうかが決まります。サブディレクトリは再帰的に検索されません。たとえば、
foo/*ではfoo内の JAR ファイルだけを検索し、foo/bar、foo/bazなどは検索しません。ディレクトリ内の JAR ファイルが展開されたクラスパスで列挙される順序は指定されず、プラットフォームにより、あるいは同じマシン上でも時間によって異なる場合があります。うまく構成されたアプリケーションは、特定の順序に依存しないようにすべきです。特定の順序が必要な場合は、クラスパスで JAR ファイルを明示的に列挙できます。
ワイルドカードの展開は早期に行われ、クラスのロード処理自体の間ではなく、プログラムの
mainメソッドの呼び出しの前に行われます。ワイルドカードを含む入力クラスパスの各要素は、指定したディレクトリ内の JAR ファイルを列挙して生成された要素のシーケンス (空の場合もある) によって置き換えられます。たとえば、ディレクトリfooにa.jar、b.jar、およびc.jarが含まれる場合、クラスパスfoo/*はfoo/a.jar:foo/b.jar:foo/c.jarに展開され、文字列はシステムプロパティーjava.class.pathの値になります。
CLASSPATH環境変数は、-classpath(または-cp) コマンド行オプションと異なって扱われることはありません。つまり、すべての場合ワイルドカードが使えます。ただし、クラスパスワイルドカードはClass-PathJAR マニフェストのヘッダーでは使えません。
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ディレクトリ内を検索します。
Copyright © 1993, 2010, Oracle and/or its affiliates. All rights reserved. Please send comments using this Feedback page. |
Java Technology |