Interstage Application Server V7.0(Interstage V7.0)以降では、アプリケーションのクラスのロードを行うクラスローダ機能が提供されました。クラスローダ機能の提供により、クラスローダのデフォルト設定が従来と異なります。このため、クラスローダの分離方法をInterstage Application Server V6.0(Interstage V6.0)までの互換である「分離しない」以外を選択した場合は、以下の点に注意してください。
配備したモジュール間で参照関係がある場合、他のモジュールのクラスやEJBアプリケーションを正しく参照できないことがあります。
異なるクラスローダで同一名のクラスをロードした場合、ClassCastExceptionが発生することがあります。
環境変数CLASSPATHが有効となりません。
メモリ使用量が変動する場合があります。「メモリ使用量について」を参照して、再度見積りを実施してください。
Interstage V6.0との違いについては、以下を参照してください。また、クラスローダの詳細については「2.3 クラスローダ」を参照してください。
IJServerのタイプが「WebアプリケーションとEJBアプリケーションを同一JavaVMで運用」である場合の、アプリケーション間の参照について
EARファイルを配備すると、下図のように、EARファイルに含まれるEJBアプリケーションはシステムクラスローダでロードされました。そのため、同一プロセス内の他のEARファイルに含まれるEJBアプリケーションを参照できました。
「クラスローダの分離」の設定値やアプリケーションの配備方法によって、アプリケーション間の参照可否が異なります。「クラスローダの分離」には「EAR間で分離」(デフォルト設定)を設定することをお勧めしますが、以下を参考にして、設定内容を検討してください。
1) 「クラスローダの分離」が「EAR間で分離」(デフォルト設定)の場合
EARファイルを配備すると、下図のように、クラスローダはEARごとに割り当てられます。このようにクラスローダを割り当てることにより、アプリケーション間の独立性が高められました。しかし、その一方で、同一プロセス内の他のEARに含まれるEJBアプリケーションを参照できなくなりました。
注意
ejb-jarを単体で配備した場合は、V6.0までと同様に、同一プロセス内の他の単体で配備したejb-jarに含まれるEJBアプリケーションを参照できます。
2) 同一プロセス内の他のEARに含まれるEJBアプリケーションを参照する方法(1)
下図のように、関連するEJBアプリケーションを1つのEARファイルに含めてIJServerに配備してください。
3) 同一プロセス内の他のEARに含まれるEJBアプリケーションを参照する方法(2)
関連するEJBアプリケーションを1つのEARファイルに含めることができない場合は、以下のどちらかの方法で、「クラスローダの分離」に「分離しない」を設定してください。
[ワークユニット] > [新規作成] > [詳細設定] > [共通定義] > [クラスローダの分離]
[ワークユニット] > [ワークユニット名] > [環境設定]> [詳細設定] > [共通定義] > [クラスローダの分離]
なお、上記は、isj2eeadminコマンドで設定することもできます。詳細は、「リファレンスマニュアル(コマンド編)」を参照してください。
クラスローダの分離については「2.3.2 クラスローダの分離」を参照してください。
4) HotDeployを行う必要がある場合
「クラスローダの分離」に「分離しない」を設定した場合は、HotDeployができません。
HotDeployを行う必要がある場合は、以下のどちらかの対処をしてください。
関連するEJBアプリケーションを1つのEARファイルとしてIJServerに配備
下図のようにEARファイル内の個々のejb-jarファイルをIJServerに配備
この場合、「クラスローダの分離」に「EAR間で分離」を設定します。
CLASSPATHについて
Interstage V6.0では環境変数:CLASSPATHに設定された値はIJServer起動時に有効となっていました。
Interstage V7.0以降ではクラスローダの分離が「EAR間で分離」または「すべて分離」の場合、以下の理由により環境変数:CLASSPATHはIJServer起動時に有効となりません。
理由
環境変数:CLASSPATHには、Interstageだけではなくそのサーバ上で動作する他のシステムが使用するライブラリが指定されている場合や、無効なライブラリ(旧バージョンのライブラリなど)が指定されている可能性があります。そのため、環境変数:CLASSPATHをIJServer起動時に有効とすると、IJServerが誤動作する原因となります。
なお、クラスローダの分離が「分離しない」の場合は、Interstage V6.0と同様に環境変数:CLASSPATHはIJServer起動時に有効となります。この場合、環境変数:CLASSPATHはシステムクラスローダでロードされます。
IJServerのクラスの設定方法については、「2.3.4 IJServerで使用するクラスの設定について」を参照してください。
J2EEプロパティおよびワークユニットのクラスパスについて
クラスローダの分離が「EAR間で分離」または「すべて分離」の場合、J2EEプロパティまたはワークユニットのクラスパスに設定されたクラスはInterstageクラスローダでロードされます。
そのためJ2EEプロパティ、またはワークユニットのクラスパスとアプリケーション(EAR、ejb-jar、WAR、RAR)の両方に同じクラス名のクラスが存在する場合、そのクラスをアプリケーションから参照するとアプリケーションのクラスが使用されます。同じクラスをJ2EEプロパティ、またはワークユニットのクラスパスに設定されたクラスから参照すると、J2EEプロパティまたはワークユニットのクラスパスに設定されたクラスが使用されます。
これは何を意味するのかというと、J2EEプロパティまたはワークユニットのクラスパスに設定されたクラスとアプリケーションのクラスが物理的に同じファイルであっても、参照する場所によって別のクラスとして扱われ、ClassCastExceptionが発生する可能性を含んでいるということになります。
これを回避するためには以下の手段が有効となります。
同じクラス名のクラスが存在しないようにアプリケーションを設計してください。ワークユニットのクラスからアプリケーションのクラスを参照する必要がある場合は、カレントスレッドのコンテキストクラスローダを使用することでアプリケーションのクラスを動的にロードすることができます。
クラスローダの分離を「分離しない」としてください。この場合はワークユニットのクラスパスに設定されたクラス、アプリケーションのクラスの両方でワークユニットのクラスパスに設定されたクラスが参照されます。
メモリ使用量について
クラスローダの分離方法に「EAR間で分離」(デフォルト設定)または「すべて分離」を選択した場合、HotDeploy機能などのクラスローダ機能の新機能を使用することができますが、EJBアプリケーションの規模に応じてメモリ使用量が変動します。
したがって、クラスローダの分離方法を変更(「分離しない」以外を選択)した場合は、メモリ使用量について再度、見積りを実施してください。
メモリ使用量の概算値は、以下の式より算出してください。
[EJBアプリケーションクラスファイルの合計サイズ]×2.0[安全係数]
Interstage V6.0とクラスローダの構成が同じV6互換モードについて
HotDeployなどのクラスローダ機能のエンハンス機能が必要ない場合、本バージョン・レベルで作成したIJServerに、定義項目「クラスローダの分離」に「分離しない」を指定することで、クラスローダの構成をV6互換モードで動作させることができます。
JNIを使用する場合
同じNativeモジュールは同じクラスローダ上からのみ利用可能です。別々のクラスローダで同じNativeモジュールをロードしようとした場合、java.lang.UnsatisfiedLinkErrorがスローされます。
Interstage V6.0まではEJBアプリケーションはすべてシステムクラスローダでロードされていましたが、本バージョン・レベルではクラスローダの分離の定義によってEJBアプリケーションをロードするクラスローダが分離されます。そのため、別々のEJBアプリケーションから同じNativeモジュールをロードしようとした場合、別々のクラスローダで同じNativeモジュールがロードされることになり、java.lang.UnsatisfiedLinkErrorがスローされる可能性があります。「2.3.7 クラスローダ使用時の注意事項」を参照して対処を行ってください。