oo

Liferayクラスローダー階層

すべてのLiferay DXP/Portalアプリケーションは、OSGiコンテナにあります。 DXP/Portalは、アプリケーションサーバーにデプロイされたWebアプリケーションです。 そのモジュールフレームワークのバンドル(モジュール)は、OSGiコンテナにあり、クラスローダーを備えています。 JavaのBootstrapクラスローダーからバンドルクラスやJSPのクラスローダまで、すべてのクラスローダーは階層の一部です。

DXPのクラスローダーには階層があり、以下のコンテキストで理解できます。

  • アプリケーションサーバーにデプロイされたLiferay DXPなどのWebアプリケーション
  • モジュールフレームワークにデプロイされたOSGiバンドル

下図は、Liferay DXPのクラスローダー階層です。

図1.0:これがLiferayのクラスローダー階層です。

以下は、クラスローダーの説明です。

  • ブートストラップ :JREのクラス(java.*パッケージから)およびJava拡張クラス($JAVA_HOME/lib/extから)。 コンテキストに関係なく、全ての java.* クラスのロードは、ブートストラップクラスローダーに委任されます。

  • システムCLASSPATH で設定したクラス、またはアプリケーションサーバーのJavaクラスパス(-cp または -classpath)パラメーターを介して渡されたクラス。

  • 共通 :アプリケーションサーバー上のWebアプリケーションにグローバルにアクセス可能なクラス。

  • Webアプリケーション(例:DXP/Portal) :アプリケーションの WEB-INF/asses フォルダおよび WEB-INF/lib/*.jarにあるクラス。

    DXP/PortalのWebアプリケーションが連携する唯一のLiferayクラスは、Liferayの Shielded Container JARファイル内にありますので、ご注意ください。

    • com.liferay.shielded.container.api.jar
    • com.liferay.shielded.container.impl.jar
  • Shielded ContainerWEB-INF/shielded-container-lib/*.jarにあるクラス。

  • モジュールフレームワーク :LiferayのOSGiモジュールフレームワーククラスローダーは、モジュールフレームワークバンドルに対して制御された分離を提供します。

  • バンドル :バンドルのパッケージや他のバンドルがエクスポートするパッケージからのクラス。

  • JSP :以下のバンドルとクラスローダーを集約したクラスローダー。

    • JSPのクラスローダーを含むバンドル
    • JSPサーブレットバンドルのクラスローダー
    • Javax Expression Language(EL)実装バンドルのクラスローダー
    • Javax JSTL実装バンドルのクラスローダー
  • サービスビルダー :サービスビルダークラス

使用されるクラスローダーはコンテキストによって異なります。 クラスローディングのルールは、アプリケーションサーバーによって異なります。 WebアプリケーションとOSGiバンドルでは、クラスローディングも異なります。 しかし、すべてのコンテキストにおいて、ブートストラップクラスローダーは、 java.* パッケージからクラスをロードします。

次は、Webアプリケーションの観点からのクラスローディングです。

Webアプリケーションのクラスローディングの観点

アプリケーションサーバーは、Liferay DXPなどのWebアプリケーションがクラスとリソースを検索する場所と順序を指示します。 Apache Tomcat などのアプリケーションサーバーは、以下のデフォルトの検索順序を適用します。

  1. ブートストラップのクラス
  2. Webアプリケーションの WEB-INF/class
  3. Webアプリケーションの WEB-INF/lib/*.jar
  4. システムクラスローダー
  5. 共通クラスローダー

まず、Webアプリケーションはブートストラップを検索します。 クラス/リソースがない場合、Webアプリケーションは自身のクラスとJARを検索します。 それでもクラス/リソースが見つからない場合は、システムクラスローダーをチェックしてから、共通クラスローダーをチェックします。 Webアプリケーションが自身のクラスとJARをチェックする以外は、親を優先して階層を検索します。

Oracle WebLogic やIBM WebSphereなどのアプリケーションサーバーには、追加のクラスローダーがあります。 また、クラスローダーの階層や検索順も異なる場合があります。 クラスロードの詳細は、アプリケーションサーバーのドキュメンテーションを参照してください。

その他のクラスローディングの観点

バンドルクラスローディングフローでは、OSGiバンドルの観点からクラスローディングについて説明します。

JSPやサービスビルダークラスのクラスロードは、WebアプリケーションやOSGiバンドルクラスのクラスロードと同様です。

これで、クラスローディング階層を理解し、Webアプリケーションのコンテキストでそれを理解し、他のクラスローディングの観点に関する情報を参照できます。

関連トピック