クラスパスとは、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環境変数を設定する方法と、旧バージョンのインストール時から残っている設定を解除する方法を説明します。CLASSPATH の設定
csh では、
setenvコマンドを使ってCLASSPATH環境変数を修正します。コマンドの形式は、次のとおりです。
setenv CLASSPATHpath1:path2sh では、次のコマンドを使って
CLASSPATH環境変数を修正します。
CLASSPATH =path1:path2:...
export CLASSPATH
CLASSPATH の設定解除
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パッケージ内に定義されている、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 © 2004 Sun Microsystems, Inc.All Rights Reserved. |   Java ソフトウェア |