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.jar
com.liferay.shielded.container.impl.jar
-
Shielded Container :
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アプリケーションのコンテキストでそれを理解し、他のクラスローディングの観点に関する情報を参照できます。