2. 同一 Java VM 内で共通に利用するクラスローダ

ここでは、ブートストラップクラスローダから共通クラスローダまでを解説します。 同一Java VM内で動作するすべてのアプリケーションは、これらのクラスローダを共有します。 これらのクラスローダがロードする対象についての概要図を、以下の図に示します。

図中の鍵括弧で囲まれた部分は、以下のパスを示しています。

[JAVA_HOME]

JDK のインストール先を示しています。

[WEBOTX]

WebOTX AS のインストール先を示しています。デフォルトのインストール先は、以下の通りです。

OS パス
Windows C:\WebOTX
UNIX系 /opt/WebOTX
[DOMAIN]

WebOTX AS で利用するドメインのパスを示しています。デフォルトのドメインを利用する場合は、以下のパスになります。

OS パス
Windows C:\WebOTX\domains\domain1
UNIX系 /opt/WebOTX/domains/domain1

以降では、これらのクラスローダの詳細を解説します。

2.1. ブートストラップクラスローダ

このクラスローダは、Javaの標準のクラスライブラリをロードするクラスローダです。 ブートストラップクラスローダに親のクラスローダはありません。 ブートストラップクラスローダは、以下のJarファイルから標準のクラスライブラリを読み込みます。

[JAVA_HOME]/jre/lib/*.jar

このパスはJDK依存のパスであり、JDKのバージョンやJDKのベンダによって異なる可能性があります。

2.2. 拡張クラスローダ

このクラスローダは、Javaの拡張機能を読み込むクラスローダです。 拡張クラスローダの親クラスローダはブートストラップクラスローダです。 拡張クラスローダは、以下のJarファイルから拡張機能を実装しているクラスライブラリを読み込みます。

[JAVA_HOME]/jre/lib/ext/*.jar
[DOMAIN]/lib/ext/*.jar

[JAVA_HOME]/jre/lib/extには、JDKが標準で提供する拡張機能のJarライブラリが配置されています。 このパスはJDK依存のパスであり、JDKのバージョンやJDKのベンダによって異なる可能性があります。

[DOMAIN]/lib/extにJarライブラリを配置すると、WebOTX ASに対して拡張機能を提供することができます。 アプリケーションでJDBCドライバを利用する場合、このディレクトリにJDBCドライバを格納したJarライブラリを配置するか、 [ 共通クラスローダ ] のクラスパスに配置する必要があります。

JDK 9以降では拡張機能メカニズムが廃止されたことにより、拡張クラスローダは廃止されました。 そのため、上記の場所にJarライブラリを配置しても読み込まれません。 なお、JDK 9以降では、システムクラスローダの親クラスローダとしてプラットフォームクラスローダが存在しますが、 プラットフォームクラスローダに任意のライブラリを読み込ませることはできません。 プラットフォームクラスローダの親クラスローダはブートストラップクラスローダです。

拡張クラスローダの詳細については、以下のJDKのマニュアルを参照してください。

The Java Extension Mechanism (英語)

http://docs.oracle.com/javase/8/docs/technotes/guides/extensions/

Java 拡張機能機構 (日本語)

http://docs.oracle.com/javase/jp/8/docs/technotes/guides/extensions/

2.3. システムクラスローダ

システムクラスローダは、WebOTX AS本体の起動に必要なライブラリのみをロードします。 システムクラスローダの親クラスローダは拡張クラスローダです。 JDK 9以降の場合、システムクラスローダの親クラスローダはプラットフォームクラスローダです。

エージェントプロセスでは、domain.xmlの設定を変更することで、ユーザ定義のクラスをシステムクラスローダで読み込ませることができます。 ただし、この設定を正しく行うためにはWebOTX ASへの深い知識が必要になりますので、通常は共通クラスローダもしくは拡張クラスローダを利用してユーザ定義のクラスライブラリをロードします。

また、アプリケーション用のクラスローダは、システムクラスローダを親に持たないため、システムクラスローダのクラスパスに含まれるクラスやリソースをアプリケーション用のクラスローダから参照することはできません。 WebOTX V8までの環境でclasspath-suffixや環境変数CLASSPATHを使用してユーザ定義のライブラリをロードしていた場合は、jarファイルを[DOMAIN]/lib/に置くか、server-classpathを使用することで、[ 共通クラスローダ ] でロードするように設定してください。

system-classpath

domain.xml中の要素<java-config>の属性system-classpathで指定したクラスパスは、WebOTX AS本体の起動に必要なライブラリの後に読み込まれます。 デフォルトではこの属性には何も指定されていません。

環境変数CLASSPATH

domain.xml中の要素<java-config>で属性env-classpath-ignored="false"の指定があった場合、環境変数CLASSPATHで指定されたクラスパスを読み込みます。 環境変数CLASSPATHは、要素<java-config>の属性system-classpathで指定したクラスパスの後に読み込まれます。 デフォルトでは属性env-classpath-ignored="true"が設定されており、環境変数CLASSPATHは読み込まれません。

WebOTX V8まで存在した属性classpath-prefixおよびclasspath-suffixは、WebOTX V9で廃止されました。 また、WebOTX V8までシステムクラスローダのクラスパスを指定するために使用されていた属性server-classpathは、WebOTX V9以降では、 [ 共通クラスローダ ] のクラスパスを指定するために使用されます。

まとめると、エージェントプロセスのシステムクラスローダでは以下の順でクラスパスを検索します。

  1. WebOTX AS本体の起動に必要なライブラリ
  2. domain.xml 中で属性system-classpathに指定したクラスパス
  3. 環境変数CLASSPATH (env-classpath-ignored="false"の場合)

一方プロセスグループにおいては、domain.xml中のsystem-classpath等の設定は反映されません。 これらのクラスパスに関する設定は、エージェントプロセスに対するものだからです。 プロセスグループでは、そのプロセスグループに対して環境変数CLASSPATHを設定することで、システムクラスローダにクラスパスを追加することができます。 設定の反映には、アプリケーショングループの再起動が必要になります。 統合運用管理ツールでの設定場所を、以下の図に示します。

まとめると、プロセスグループのシステムクラスローダは、以下の順でクラスパスを検索します。

  1. WebOTX AS本体の起動に必要なライブラリ
  2. 環境変数CLASSPATH (もし設定されていれば)

2.4. パブリックAPIクラスローダ

パブリックAPIクラスローダは、配備されたアプリケーション用にWebOTXが明示的にエクスポートしているクラスを使用可能にします。 この中には、Java EE APIなどが含まれます。 パブリックAPIクラスローダの親クラスローダは拡張クラスローダです。 JDK 9以降の場合、パブリックAPIクラスローダの親クラスローダはプラットフォームクラスローダです。 パブリックAPIクラスローダは、以下の場所からクラスライブラリを読み込みます。

  1. [WEBOTX]/modules/*.jar

[WEBOTX]/modules/にはWebOTXの動作に必要なJarファイルが配置されています。 ここに配置されたファイルの構成を変更する事はサポート対象外であり、このディレクトリにユーザ定義のJarを配置してはいけません。

2.5. 共通クラスローダ

共通クラスローダは、ドメイン内で動作するアプリケーションで共通に利用するクラスをロードします。共通クラスローダの親クラスローダはパブリックAPIクラスローダです。

共通クラスローダは、以下の場所からクラスライブラリを読み込みます。

  1. [WEBOTX]/lib/*.jar
  2. [DOMAIN]/lib/classes
  3. [DOMAIN]/lib/*.jar

[WEBOTX]/lib/にユーザ定義のJarを配置することは、サポート対象外です。 [DOMAIN]/lib/classesには、ドメイン内で共通に利用するクラスのクラスファイルを配置します。 [DOMAIN]/libには、ドメイン内で共通に利用するクラスが格納されているJarファイルを配置します。

上記の位置に複数のアプリケーションで共通に利用するライブラリを配置すると、WAR ファイルやEARファイルの中にライブラリを含める必要がなくなります。 ただし、共通するライブラリをバージョンアップ等の理由で置換すると、そのライブラリを利用する全てのアプリケーションが影響を受けます。 また、ライブラリを追加・削除・置換する際には、ドメインを再起動する必要があります。

domain.xmlのserver-classpathやシステムプロパティcom.nec.webotx.enterprise.common-classpathを設定することで、ユーザ定義のクラスを共通クラスローダで読み込ませることができます。

server-classpath

domain.xml中の要素<java-config>の属性server-classpathで指定したクラスパスは、[DOMAIN]/lib/*.jarの後に読み込まれます。 この設定は、エージェントプロセスとプロセスグループの両方で有効です。 デフォルトではこの属性には何も指定されていません。

システムプロパティcom.nec.webotx.enterprise.common-classpath

システムプロパティcom.nec.webotx.enterprise.common-classpathで指定したクラスパスは、server-classpathの後に読み込まれます。 この設定は、エージェントプロセスと各プロセスグループごとに個別に設定できます。 デフォルトではこのシステムプロパティは設定されていません。