クラスの検索方法

SDK ツール

Java 起動ツールがクラスを検索する方法

Java 起動ツール java は、Java Virtual Machine (VM) を起動します。VM は、次の順序でクラスを検索してロードします。

実際には、この 3 つの検索パスは 1 つのクラスパスに結合されます。これは、以前に使われていた「平坦な」クラスパスに似ていますが、現在のモデルには重要な相違点がいくつかあります。

Java 起動ツールがブートストラップクラスを検索する方法

ブートストラップクラスは、Java 2 プラットフォームを実装しているクラスです。ブートストラップクラスは、jre/lib ディレクトリの rt.jari18n.jar の 2 つのアーカイブ内に格納されています。アーカイブは、システムプロパティ sun.boot.class.path に格納されているブートストラップクラスパスの値によって指定されます。このシステムプロパティは参照専用で、直接修正してはなりません。

ブートストラップクラスのパスの再定義が必要になることは、ほとんどありません。まれに、別のコアクラスのセットを使用する必要が生じた場合には、非標準のオプション -Xbootclasspath を使ってブートストラップクラスのパスを再定義することができます。

Java 2 SDK ツールを実装したクラスはブートストラップクラスとは別のアーカイブに分けられているので、注意してください。 ツールのアーカイブは SDK の /lib/tools.jar ファイルです。開発ツールはこのアーカイブを、起動ツールを呼び出すときにユーザクラスパスに追加します。ただし、この追加後のユーザクラスパスは起動ツールの実行時にだけ使用されます。ソースコードの処理を行うツール javacjavadoc は、追加後のクラスパスではなく元のクラスパスを使用します。(詳細は、次の「javac と javadoc がクラスを検索する方法」を参照)

Java 起動ツールが拡張機能クラスを検索する方法

拡張機能クラスは、Java プラットフォームを継承するクラスです。拡張機能ディレクトリ jre/lib/ext 内の .jar ファイルはすべて拡張機能とみなされ、Java 拡張機能機構を使ってロードされます。拡張機能ディレクトリ内でどれにも属さないクラスファイルは、見つけることができません。これらのファイルは、.jar ファイル (または .zip ファイル) 内に含まれている必要があります。拡張機能ディレクトリの位置を変更するためのオプションはありません。

Java 起動ツールがユーザクラスを検索する方法

ユーザクラスは、Java プラットフォームの上に構築されるクラスです。ユーザクラスを探すために、起動ツールはユーザクラスパス (ディレクトリのリスト、JAR アーカイブ、クラスファイルの入った ZIP アーカイブ) を参照します。

クラスには、そのクラスの完全指定された名前を反映したサブパス名があります。たとえば、クラス com.mypackage.MyClass/myclasses 内に格納されている場合、/myclasses はユーザクラスパス内に含まれていなければならず、そのクラスファイルへの絶対パスは /myclasses/com/mypackage/MyClass.class でなければなりません。 クラスが myclasses.jar という名前のアーカイブ内に格納されている場合、ユーザクラスパスには myclasses.jar が含まれていなければならず、クラスファイルはアーカイブ内に com/mypackage/MyClass.class として格納されていなければなりません。

ユーザクラスパスは文字列として指定され、Solaris ではクラスパスのエントリはコロン (:) で区切られ、Win32 システムではエントリはセミコロン (;) で区切られます。java 起動ツールは、ユーザクラスパスの文字列をシステムプロパティ java.class.path に書き込みます。この値は、次のどれかから取得可能です。

Java 起動ツールが JAR-class-path クラスを検索する方法

JAR ファイルには、通常、「マニフェスト」が含まれます。マニフェストは JAR ファイルの内容のリストです。 マニフェストは、クラスパスをさらに継承する JAR-class-path を定義できます (ただし、パスを継承するのは、その JAR ファイルからクラスをロードしている間だけ)。JAR-class-path がアクセスするクラスは、次の順序で検索されます。

javac と javadoc がクラスを検索する方法

javacjavadoc の各ツールは、2 つの異なった方法でクラスファイルを使用します。

ソースコードの参照を解決するために使用されるクラスファイルは、ほとんどは javacjavadoc の実行に使用されるのと同じファイルです。ただし、重要な例外があります。

参照されているクラスがクラスファイルとソースファイルの両方で定義されている場合、javadoc は常にソースファイルを使用します (javadoc はソースファイルをコンパイルしない)。同じ場合に、javac はクラスファイルを使用しますが、古くなったと判断したクラスファイルを自動的に再コンパイルします。自動再コンパイルの規則については、Windows または Solaris 用の javac ドキュメントで説明しています。

デフォルトでは、javacjavadoc はユーザクラスパスでクラスファイルとソースコードファイルの両方を検索します。-sourcepath オプションを指定すると、javacjavadoc は、指定されたソースファイルパスだけを検索します。

クラスのロードとセキュリティポリシー

クラスまたはインタフェースを使用するためには、クラスローダでロードする必要があります。特定のクラスローダの使い方により、そのクラスローダに関連するセキュリティポリシーが決定されます。

プログラムは、クラスローダオブジェクトの loadClass メソッドを呼び出すことにより、クラスまたはインタフェースをロードすることができます。しかし通常は、プログラムは単に参照によってクラスやインタフェースをロードします。クラスやインタフェースを参照すると、内部クラスローダが呼び出されます。 内部クラスローダは、セキュリティポリシーを拡張機能とユーザクラスに適用することができます。セキュリティポリシーが有効になっていない場合、すべてのクラスは「信頼できる」と判断されます。セキュリティポリシーが有効な場合でも、ブートストラップクラスにはセキュリティポリシーは適用されないので、常に「信頼できる」とみなされます。

セキュリティポリシーは、有効な場合に、システムポリシーファイルとユーザポリシーファイルによって設定されます。Java 2 SDK にはシステムポリシーファイルがあり、このポリシーファイルは拡張機能クラスには「信頼できる」状態を認可し、ユーザクラスには基本的なアクセス制限を課します。

セキュリティポリシーの設定と有効化については、「セキュリティ」を参照してください。

注: Java 1.1 プラットフォームで使われるセキュリティプログラミング技法の中には、Java 2 プラットフォームのクラスロードモデルとの互換性がないものがあります。