クラスローダ

この章では、WebOTX AS が利用するクラスローダについて解説します。 クラスローダについての知識は、アプリケーションが共通に利用するクラスファイルやJarライブラリの配置場所を決定する際に役立ちます。

1. クラスローダの階層

クラスローダは階層構造になっており、この階層構造に従ってクラスをロードします。 Java VM 等からクラスのロードの要求があった場合、クラスローダはまず親のクラスローダにクラスのロード処理を委譲します。 親のクラスローダでクラスがロードできなかった場合、そのクラスローダ自身でクラスをロードしようとします。 それでもクラスが見つからない場合、NoClassDefFoundErrorまたはClassNotFoundExceptionがスローされます。 WebOTX ASのクラスローダについて理解しておくことは、開発者や運用者がアプリケーション共通で使うJARアーカイブやアプリケーション・モジュールのためのリソース・ファイルを、どの位置に配置すべきかを決める際に重要な助けとなります。

WebOTX AS で利用しているクラスローダの階層を以下の図に示します。

ブートストラップクラスローダからApplibsクラスローダまでは、同一Java VM内で共通に利用するクラスローダです。 破線で囲まれたクラスローダは、アプリケーションをロードするクラスローダです。 WAR、EJB、EAR、ライフサイクルモジュールはクラスローダによって分離されているため、お互い干渉することなく動作することができます。 RARは他のアプリケーションから利用されるという性質上、コネクタクラスローダはドメイン内で共通に利用されます。 Applibsクラスローダはドメイン内で共通ですが、アプリケーションからは配備時に指定したライブラリのみ参照可能です。

一般に、下位のクラスローダでロードしたクラスは上位のクラスローダでロードしたクラスを参照できますが、その逆はできません。 つまり、上位のクラスローダでロードしたクラスは、下位のクラスローダでロードしたクラスを参照できず、NoClassDefFoundErrorまたはClassNotFoundExceptionの原因となります。 アプリケーションを構築する上で、この原則に従うようにライブラリを配置する必要があります。