クラスの検索方法

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

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

実際には、この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またはUnix用のjavacドキュメントで説明されています。

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

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

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

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

有効になっているときは、セキュリティ・ポリシーはシステムおよびユーザー・ポリシー・ファイルによって設定されます。Java 2 SDKはシステム・ポリシー・ファイルをインクルードします(拡張機能クラスに「信頼」ステータスを付与し、ユーザー・クラスに基本的な制限を適用します)。

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

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


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