クラス・ローダー拡張の使用

最終更新: 2002 年 12 月 9 日

Eclipse 2.1 には、クラス・ロードの領域など、多くのパフォーマンス強化が組み込まれています。 これを支援するために、プラグイン・マニフェスト・ファイルにマークアップが追加されています。 このファイルではその使用について説明します。

活動化

クラス・ローダーのパフォーマンス強化は、デフォルトで自動的に可能になります。 この動作を無効にして、パフォーマンス強化を不可にするには、 -noPackagePrefixes コマンド行引き数を Eclipse 実行可能ファイルに渡してください。

フォーマット

プラグイン・マニフェスト・ファイルのパッケージ接頭部の宣言は、 このファイル内で宣言されているライブラリーごとの packages エレメントで示されます。 packages エレメントには、ライブラリーに対するパッケージ接頭部をリストする prefixes 属性があります。

通常 jar ファイルには、複数のパッケージに存在するコードが含まれています。 たとえば、org.eclipse.core.runtime プラグインには、以下のパッケージ内のコードが含まれています。
    org.eclipse.core.runtime
    org.eclipse.core.internal.runtime,
    org.eclipse.core.internal.plugins
    org.eclipse.core.runtime.model
.

この場合、plugin.xml は以下を指定します。

    <runtime>
        <library name="runtime.jar">
            <export name="*"/>
            <packages prefixes="org.eclipse.core"/>
        </library>
    </runtime>

org.eclipse.core は、 プラグイン内のすべてのパッケージに共通の接頭部であることに注意してください。 代わりに、ファイル内の 4 つのすべての接頭部を、コンマで区切られたリストとして宣言することもできます。 この場合、複数のエントリーに対して必要な検査数と false ヒットを含む可能性のある接頭部のトレードオフを検討する必要があります。 コードの構造化の方法によっては、より一般的な接頭部を併用するよりも、5 から 10 のパッケージ接頭部をリストする方が最善の方法になります。 たとえば、ご使用のすべてのコードが複数のプラグインにわたって同じ接頭部を含む場合 (例: com.mycompany)、 ファイル内に単一接頭部 "com.mycompany" しかリストしていないとその利点をフルに活用することができません。

プラグインに複数のライブラリー宣言が含まれている場合、 その jar から宣言ごとにパッケージ接頭部について説明する必要があります。

プラグイン・マニフェストに packages エレメントが組み込まれていない場合、 コードは機能しますがクラス・ロード最適化を利用することはできません。 パッケージ接頭部のリストは、プラグインのすべてのライブラリー内のすべてのパッケージに対して完全でなければならないことに注意してください。 このリストが完全でない場合、コードは機能しません。

クラス・ローダー・プロパティー・ファイルの使用

Eclipse 2.0.2 および Eclipse 2.1 Integration ビルドでは、クラス・ロード強化を使用できるよう、 パッケージ接頭部を含むクラス・ローダー・プロパティー・ファイルを指定できる機能が追加されました。 このファイルの使用については、 ここに示されています。

Eclipse 2.1 はクラス・ローダー・プロパティー・ファイルに対して完全に下位互換であり、 プラグイン・マニフェスト内のパッケージ接頭部宣言と共に使用することができます。 このセクションでは、これら 2 つの機構間の相互作用の動作について説明します。

デフォルト動作: (コマンド行引き数なし) パッケージ接頭部は plugin.xml ファイルから読み取られ、 クラス・ロード・ストラテジーに適用されます。 classloader.properties ファイルはアクセスされず、考慮されません。

-classloaderProperties の使用: パッケージ接頭部が plugin.xml ファイルから読み取られ、 次に classloader.properties ファイルが読み取られます。 マニフェスト・ファイルに接頭部が定義されているプラグインのクラス・ロード・プロパティー・ファイルにエントリーがある場合、 プロパティー・ファイル内のエントリーがオーバーライドされ、優先されます。 (結果はマージされません) プロパティー・ファイル内のエントリーに値が含まれない場合 (例: org.eclipse.core.runtime=)、 マニフェスト・ファイル内で宣言されている接頭部は除去され、クラス・ロード・ストラテジーはデフォルトで強化を使用しません。

-noPackagePrefixes の使用: プラグイン・マニフェスト・ファイル内で宣言されているパッケージ接頭部は無視され、 クラス・ローダー・プロパティー・ファイルも考慮されません。 クラス・ロード・ストラテジーはデフォルトで接頭部強化を使用しません。

-classloaderProperties と -noPackagePrefixes の両方を使用: プラグイン・マニフェスト・ファイル内のパッケージ宣言は無視されます。 クラス・ロード・プロパティー・ファイルが読み取られ、クラスがロードされるとその中で定義されている宣言が考慮されます。

トラブルシューティング

java.lang.ClassNotFoundException が発生した場合、 マニフェストまたはプロパティー・ファイル内のエントリーに問題がある可能性があります。 -noPackagePrefixes コマンド行引き数で Eclipse を実行してみてください。 このとき -classloaderProperties 引き数は使用しないでください。 これにより、パッケージ接頭部に関してすべてのクラス・ロード強化が使用不可になります。

これを行った後にコードが正常に実行される場合、ファイルの構文は正しいと考えられますが、 コンマ区切りリスト内のパッケージ接頭部のエントリーが欠落している可能性があります。 この問題を検査するには、ファイル内の該当する行をコメント化してください。 プロパティー・ファイル内の問題のプラグイン行をコメント化するには、番号記号 (#) を使用するか、 HTML コメント文字 (<!-- ... -->) を使用して問題の plugin.xml ファイル内のパッケージ宣言をコメント化してください。

既知の問題

プラグイン・マニフェスト・ファイルでパッケージ接頭部のリストが宣言されている場合、 そのファイルに寄与するすべてのフラグメントについてもそのパッケージ接頭部をリストしなければなりません。 リストがない場合、NoClassDefFoundError 問題が発生します。 この問題は -noPackagePrefixes コマンド行引き数を使用してクラス・ローダー強化をオフにするか、 プラグインおよびそのすべてのフラグメントに該当するパッケージ接頭部エントリーを追加することによって解決することができます。

Copyright IBM Corporation and others 2000, 2003.