Java EE クライアント・アプリケーションのクラス・ロード
Java™ Platform, Enterprise Edition (Java EE) アプリケーション・クライアントを稼働する際に、アプリケーションが使用するクラスをロードするための階層形式のクラス・ローダーが作成されます。
- Application Client for WebSphere® Application Server (Application Client) ランタイムは、この値を WAS_LOGGING 環境変数に設定します。
extensions class loader は、 ブートストラップ・クラス・ローダーに対する子です。 このクラス・ローダーには、java/jre/lib/ext ディレクトリー内の JAR ファイルか、 Java コマンドの -Djava.ext.dirs パラメーターによって定義される JAR ファイルが含まれています。 Application Client クライアント・ランタイムは、-Djava.ext.dirs パラメーターを設定しません。このため、java/jre/lib/ext ディレクトリーの JAR ファイルが使用されます。
拡張クラス・ローダーは、ブートストラップ・クラス・ローダーに対する子です。このクラス・ローダーには JAR ファイルが含まれています。 JAR ファイルは、app_server_root /java/ext ディレクトリー、 java_home/lib/ext または java_home/jre/lib/ext ディレクトリー、および /QIBM/UserData/Java400/ext ディレクトリーに存在します。 app_server_root ディレクトリーは、製品のインストール・パスです。 java_home ディレクトリーは、Java ファイルのインストール・パスです。
重要: 使用可能な Java 仮想マシン (JVM) に従って、java_home パラメーターには 3 つの値のうちいずれかを指定することができます。指定可能な 3 つの値は以下のとおりです。
- /QOpenSys/QIBM/ProdData/JavaVM/jdk60/32bit (Java SE 6 32 ビット)
- /QOpenSys/QIBM/ProdData/JavaVM/jdk60/64bit (Java SE 6 64 ビット)
- システム・クラス・ローダーには、Java コマンドの -classpath パラメーターによって定義されている JAR ファイルおよびクラスが含まれています。Application Client ランタイムは、このパラメーターを WAS_CLASSPATH 環境変数に設定します。
- WebSphere クラス・ローダーは、Application Client ランタイム、および Application Client ユーザー・ディレクトリーに配置されたすべてのクラスをロードします。このクラス・ローダーによって使用されるディレクトリーは、WAS_EXT_DIRS 環境変数によって定義されます。 WAS_BOOTCLASSPATH、WAS_CLASSPATH、および WAS_EXT_DIRS 環境変数は、 WebSphere Application Server のインストールの場合は app_server_root/bin/setupCmdLine スクリプト、クライアント・インストールの場合は app_server_root/bin/setupClient スクリプトに設定されます。
Java EE アプリケーション・クライアント・ランタイムを初期化すると、 追加のクラス・ローダーが WebSphere クラス・ローダーの子として作成されます。 クライアント・アプリケーションで Java DataBase Connectivity (JDBC) API、Java Message Service (JMS) API、または Uniform Resource Locator (URL) などのリソースを使用する場合には、これらの各リソースをロードするための異なるクラス・ローダーが作成されます。最後に、Application Client ランタイムは、WebSphere クラス・ローダーが、クライアント JAR マニフェストを繰り返し処理することによって EAR ファイル内のクラスをロードするように設定します。CLASSPATH 環境変数で定義されるシステム・クラスパスは使用されることはなく、 クラス・ローダーの階層には含まれません。
クライアント・アプリケーションを正しくパッケージ化するためには、 どのクラス・ローダーがクラスをロードするのかを理解している必要があります。 Java コードによってクラスをロードする場合、 コードに対して、そのクラスのロードで使用されるクラス・ローダーが割り当てられます。 後になってそのクラスによってロードされるクラスはいずれも、 そのクラス・ローダーまたはその親のうちのいずれかを使用しますが、 子のクラス・ローダーを使用することはありません。
WSCL0205W: The incorrect class loader was used to load [0]このメッセージは、 クライアント・アプリケーション・クラスが階層中の親クラス・ローダーのいずれかによってロードされたときに出されます。 この状態は、通常、EAR ファイルとハード・ディスクに同じクラスがある場合に引き起こされます。親クラス・ローダーのいずれかがあるクラスを見つけると、そのクラス・ローダーは、Application Client ランタイムのクラス・ローダーよりも前にそのクラスをロードします。場合によっては、クライアント・アプリケーションは依然として正しく機能します。 ただし、ほとんどの場合は、「クラスが見つかりません」という例外を受け取ります。
クラスパス・フィールドの構成
Java EE クライアント・アプリケーションをパッケージ化する場合、 さまざまなクラスパス・フィールドを構成する必要があります。 理想的には、アプリケーションが必要とするものすべてを EAR ファイルにパッケージすべきです。 これは、Java EE クライアント・アプリケーションをクライアントに配布する最も簡単な方法です。 ただし、JDBC API、JMS API、または URL のようなリソースは、 パッケージにしないようにしてください。 このようなリソースの場合は、ハード・ディスク上のそれらのクラスにアクセスするのに、クラスパス参照を使用してください。また、再配布する必要のない他のクラスがクライアント・マシン上にインストールされている場合があります。 この場合も、このトピックで後述するように、ハード・ディスク上のクラスにアクセスするのにクラスパス参照を使用することができます。
EAR ファイル内のクラスの参照
- これらの値は、EAR ファイルに含まれている JAR ファイルとクラス・ファイルを参照する必要があります。
- これらの値は、EAR ファイルのルートを起点とする相対的な値でなければなりません。
- 値は、ファイル・システム内の絶対パスを参照できません。
- 値が複数の場合は、コロンでもセミコロンでもなく、スペースで区切らなければなりません。
普通は、モジュール (JAR ファイル) を EAR ファイルのルートに追加します。この場合、クラスパス・フィールドにモジュール (JAR ファイル) の名前だけを指定すれば済みます。 パスを使用してモジュールを追加することにした場合は、EAR ファイルのルートを起点とする相対パスを指定する必要があります。
クラス・ファイルを参照するには、EAR ファイルのルートを起点とする相対ディレクトリーを指定する必要があります。アセンブリー・ツールを使用すると、個々のクラス・ファイルを EAR ファイルに追加できます。 これらの追加のクラス・ファイルは、JAR ファイルにパッケージ化することをお勧めします。 この JAR ファイルをモジュールのクラスパス・フィールドに追加します。クラス・ファイルを EAR ファイルのルートに追加する場合は、 ./ をモジュールのクラスパス・フィールドに追加します。
次のディレクトリー構造の例について考えてみます。 このディレクトリー構造では、myapp.ear ファイルに、 myclient.jar という名前のアプリケーション・クライアント JAR ファイルと mybeans.jar EJB モジュールが含まれています。 追加クラスは、class1.jar ファイルと utility/class2.zip ファイルに存在します。 xyz.class という名前のクラス・ファイルは、JAR ファイルではなく、EAR ファイルのルートにパッケージ化されています。 Classpath プロパティーの値として ./mybeans.jar utility/class2.zip class1.jar を指定してください。 検索順序は、myapp.ear/myclient.jar myapp.ear/xyz.class myapp.ear/mybeans.jar myapp.ear/utility/class2.zip myapp.ear/class1.jar になります。
EAR ファイル内にないクラスの参照
launchClient の -CCclasspath パラメーターを使用します。 このパラメーターは、実行時に指定され、 プラットフォーム固有のクラスパスの値を取ります。 この場合、複数の値はセミコロンまたはコロンで区切られます。 この点に関しては、クライアントとサーバーは類似しています。
リソースのクラスパス
アプリケーション・クライアント・リソース構成ツール (ACRCT)、
または z/OS® ACRCT スクリプト・ツールを使用して、クライアント・アプリケーションで使用されるリソースを構成する場合、
そのリソースで必要なクラスパスを指定することができます。
例えば、アプリケーションが DB2® データベースに対して JDBC を使用する場合は、
データベース・プロバイダーのクラスパス・フィールドに db2java.zip を追加します。
これらのクラスパス値はプラットフォーム固有であり、
複数の値を分離するのにセミコロンまたはコロンを必要とします。
WebSphere Application Server for i5/OS™ では、IBM® Developer Kit for Java JDBC プロバイダーを使用して DB2/400 にアクセスする場合、 db2_classes.jar ファイルをクラスパスに追加する必要はありません。 ただし、IBM Toolbox for Java JDBC プロバイダーを使用する場合は、jt400.jar ファイルの場所を指定する必要があります。
launchClient API の使用
launchClient コマンドを使用する場合は、 WebSphere クラス・ローダー階層が自動的に作成されます。 しかし、launchClient API を使用する場合には、 このセットアップを自分で行う必要があります。 Java システム・プロパティーを定義する場合は、 launchClient シェル・コマンドをコピーします。