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

以下は、クラスローダーの説明です。
-
ブートストラップ: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.jarcom.liferay.shielded.container.impl.jar
-
シールド コンテナー:
WEB-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 などのアプリケーション サーバーは、次のデフォルトの検索順序を適用します。
- ブートストラップのクラス
- Webアプリケーションの
WEB-INF/class - Webアプリケーションの
WEB-INF/lib/*.jar - システムクラスローダー
- 共通クラスローダー
まず、Webアプリケーションはブートストラップを検索します。 クラス/リソースがない場合、Webアプリケーションは自身のクラスとJARを検索します。 それでもクラス/リソースが見つからない場合は、システムクラスローダーをチェックしてから、共通クラスローダーをチェックします。 Webアプリケーションが自身のクラスとJARをチェックする以外は、親を優先して階層を検索します。
Oracle WebLogic や IBM WebSphere などのアプリケーション サーバーには、追加のクラスローダーがあります。 また、クラスローダーの階層や検索順も異なる場合があります。 クラスロードの詳細は、アプリケーションサーバーのドキュメンテーションを参照してください。
その他のクラスローディングの観点
バンドル クラスローディング フロー では、OSGi バンドルの観点からクラスローディングについて説明します。
JSPやサービスビルダークラスのクラスロードは、WebアプリケーションやOSGiバンドルクラスのクラスロードと同様です。
これで、クラスローディング階層を理解し、Webアプリケーションのコンテキストでそれを理解し、他のクラスローディングの観点に関する情報を参照できます。