クラスの検索方法

SDK ツール

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

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

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

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

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

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

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

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

拡張機能クラスは、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

2つ前のセグメントに統合

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

ユーザクラスは、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 に書き込みます。この値は、次のいずれかのソースから取得されます。

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

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

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

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

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

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

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

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

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

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

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

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

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


Copyright © 2001 Sun Microsystems, Inc. All Rights Reserved.

Sun
Java Software