クラスの検索方法

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

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

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

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

ブートストラップクラスは、Java 2 Platform を実装しているクラスです。ブートストラップクラスは、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

実際にロードされるクラスは未定義になります。

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 ファイルからクラスをロードしているときのみ)、JAR-class-path を定義できます。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 Platform のクラスロードモデルと互換性のないものがあります。


Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.