Java 起動ツール java は、Java 仮想マシン (VM) を起動します。仮想マシンは、次の順序でクラスを検索してロードします。
rt.jar
とその他のいくつかの重要な JAR ファイル内のクラスが含まれる。.jar
ファイルとしてバンドルされている。実際には、この 3 つの検索パスは 1 つのシンプルなクラスパスに結合されます。これは、以前に使われていた「平坦な」クラスパスに似ていますが、現在のモデルには重要な相違点がいくつかあります。
ブートストラップクラスは、Java 2 Platform を実装しているクラスです。ブートストラップクラスは、jre/lib
ディレクトリの rt.jar
とその他のいくつかの JAR ファイルに格納されています。これらのアーカイブは、システムプロパティー sun.boot.class.path
に格納されているブートストラップクラスパスの値によって指定されます。このシステムプロパティーは参照専用なので、直接修正しないでください。
ブートストラップクラスパスの再定義が必要になることはほとんどありません。まれに、別のコアクラスのセットを使用する必要が生じた場合には、非標準オプション -Xbootclasspath を使って行うことができます。
Java 2 SDK ツールを実装するクラスは、ブートストラップクラスとは別のアーカイブに分けられています。ツールアーカイブは、SDK の /lib/tools.jar
ファイルです。開発ツールは、起動ツールを呼び出すときに、このアーカイブをユーザークラスパスに追加します。ただし、この追加後のユーザークラスパスは、ツールを実行するためだけに使用されます。ソースコードを処理するツール (javac と javadoc) は、追加後のクラスパスではなく、元のクラスパスを使用します。(詳細は、このあとの「javac と javadoc がクラスを検索する方法」を参照してください)。
拡張機能クラスは、Java プラットフォームを拡張するクラスです。拡張機能ディレクトリ jre/lib/ext 内の .jar
ファイルはすべて拡張機能とみなされ、Java 拡張機能フレームワークを使ってロードされます。拡張機能ディレクトリ内の圧縮されていないクラスファイルは、見つけることができません。.jar ファイル (または .zip ファイル) 内に含まれている必要があります。拡張機能ディレクトリの位置を変更するためのオプションはありません。
jre/lib/ext ディレクトリに複数の .jar
ファイルが含まれており、次のように、これらのファイルに同じ名前のクラスが含まれている場合、
smart-extension1_0.jar contains class smart.extension.Smart
smart-extension1_1.jar contains class smart.extension.Smart
実際にロードされるクラスは未定義になります。
ユーザークラスは、Java プラットフォーム上に構築されるクラスです。ユーザークラスを探すために、起動ツールは、ユーザークラスパス (クラスファイルの入ったディレクトリ、JAR アーカイブ、ZIP アーカイブのリスト) を参照します。
クラスファイルは、そのクラスの完全修飾名が反映されたサブパス名を持ちます。たとえば、クラス com.mypackage.MyClass
が /myclasses
に格納されている場合、/myclasses
はユーザークラスパスに含まれている必要があり、クラスファイルへのフルパスは /myclasses/com/mypackage/MyClass.class
でなければいけません。クラスが myclasses.jar
という名前のアーカイブ内に格納されている場合、myclasses.jar
はユーザークラスパスに含まれている必要があり、クラスファイルはアーカイブ内に com/mypackage/MyClass.class
として格納されていなければいけません。
ユーザークラスパスは文字列として指定され、Solaris ではクラスパスエントリはコロン (:
) で区切られ、Microsoft Windows システムではエントリはセミコロン (;
) で区切られます。Java 起動ツールは、ユーザークラスパス文字列をシステムプロパティー java.class.path
に書き込みます。この値は、次のいずれかのソースから取得されます。
.
」。ユーザークラスファイルは、現在のディレクトリ内 (パッケージ内の場合、その下) のすべてのクラスファイル。JAR ファイルには通常、「マニフェスト」 (その JAR の内容をリストしたファイル) が含まれます。マニフェストには、クラスパスをさらに拡張する (その JAR ファイルからクラスをロードしているときのみ)、JAR-class-path を定義できます。JAR-class-path によってアクセスされるクラスは、次の順序で検索されます。
javac および javadoc の各ツールは、2 つの異なった方法でクラスファイルを使用します。
ソースコード参照を解決するために使用されるクラスファイルのほとんどは、javac と javadoc の実行に使用されるのと同じクラスファイルです。ただし、いくつかの重要な例外があります。
tools.jar
内のツールクラスは、javac と javadoc を実行するためだけに使用される。ツールクラスは、tools.jar
がユーザークラスパス内にある場合を除いて、ソースコード参照を解決するためには使用されない。参照されるクラスがクラスファイルとソースファイルの両方で定義されている場合、javadoc は常にソースファイルを使用します (javadoc はソースファイルをコンパイルしない)。同じ状況の場合に、javac はクラスファイルを使用しますが、古くなったと判断されるクラスファイルは自動的に再コンパイルします。自動再コンパイルの規則については、Windows または Solaris 用の javac ドキュメントで説明されています。
デフォルトでは、javac と javadoc は、ユーザークラスパスからクラスファイルとソースコードファイルの両方を検索します。-sourcepath オプションが指定されている場合、javac と javadoc は、指定されたソースファイルパスでのみソースファイルを検索します。ただし、クラスファイルは同様にユーザークラスパスから検索されます。
クラスまたはインタフェースを使用するためには、クラスローダでロードする必要があります。特定のクラスローダの使い方により、そのクラスローダに関連するセキュリティーポリシーが決定されます。
プログラムでは、クラスローダオブジェクトの loadClass メソッドを呼び出すことにより、クラスまたはインタフェースをロードできます。ただし通常は、プログラムは単に参照することによってクラスやインタフェースをロードします。これにより内部クラスローダが呼び出されます (セキュリティーポリシーを拡張機能およびユーザークラスに適用できます)。セキュリティーポリシーが有効になっていなかった場合でも、すべてのクラスが「信頼」されます。セキュリティーポリシーが有効な場合でも、ブートストラップクラスには適用されません (常に「信頼」されます)。
有効になっているときは、セキュリティーポリシーはシステムおよびユーザーポリシーファイルによって設定されます。Java 2 SDK はシステムポリシーファイルをインクルードします (拡張機能クラスに「信頼」ステータスを付与し、ユーザークラスに基本的な制限を適用します)。
セキュリティーポリシーの有効化または設定については、「セキュリティー機能」を参照してください。
注: Java 1.1 プラットフォームで使われていたセキュリティープログラミング技法の中には、Java 2 Platform のクラスロードモデルと互換性のないものがあります。