J2EEアプリケーションを作成する際は、クラスがどのクラスローダでロードされるかを考慮する必要があります。
ロードするクラスローダを誤った場合、J2EEアプリケーションが正常に動作しない場合があります。このようなトラブル発生時の調査に役立てるために、トレース機能を提供しています。
トレース機能は、クラスがロードされた時にどのクラスローダ上でロードされたかを“コンテナログ”に出力します。“コンテナログ”では以下が確認できます。
クラスがロードされた順番
クラスがロードされたクラスローダ
出力形式
トレース情報の形式を以下に示します。
クラスローダが“Webappクラスローダ”または“Applicationクラスローダ”の場合
[タイムスタンプ] [Loaded クラス名 from リポジトリ by クラスローダの種別] |
クラスローダが“システムクラスローダ”、“Interstageクラスローダ”の場合
[タイムスタンプ] [Loaded クラス名 by クラスローダの種別] |
出力項目
項目 | 内容 | |
---|---|---|
タイムスタンプ | クラスをロードした日時 | |
クラス名 | ロードしたクラスのクラス名(パッケージ名を含む) | |
リポジトリ | ロードしたクラスの保管先ディレクトリ名またはjarファイル名 | |
クラスローダの種別 | クラスをロードしたクラスローダの名称 | |
クラスローダ | 表示名 | |
システムクラスローダ | System | |
Interstageクラスローダ | Interstage | |
Catalinaクラスローダ | Catalina | |
Applicationクラスローダ | Application | |
Webappクラスローダ | Webapp |
注意
システムクラスローダでロードされたクラスから使用されるクラスのトレースは出力されません。システムクラスローダでロードされるクラスは“2.3.1 クラスローダの構成”を参照してください。
システムクラスローダでロードされたクラスから使用されるクラスのトレースを出力したい場合はワークユニットのJavaVMオプションに-verbose:classを指定してJavaVMのトレース情報を取得してください。
ログの出力イメージ
[24/02/2004 16:17:22:093 +0900] [Loaded com.xxx.ClassA by Interstage] |
設定方法
トレースを出力するには、ワークユニットのJavaVMオプションに以下のオプションを設定します。
-Dcom.fujitsu.interstage.j2ee.ijserver.loader.trace=true |
注意
トレース機能は、開発時のデバッグのための機能です。運用環境では使用しないことを推奨します。
使用例
ここではクラスローダのトレース機能の使用例について説明します。
以下の問題が発生した場合にクラスローダのトレース情報を採取してください。クラスローダのトレース情報は問題解決のための手助けとなります。
ServletからEJBアプリケーションの呼び出しに失敗。コンテナログの解析の結果、ClassAでClassCastExceptionが発生していることを検出。
以下の手順で解析を行います。
ワークユニットのJavaVMオプションに以下のオプションを設定。
-Dcom.fujitsu.interstage.j2ee.ijserver.loader.trace=true
再現テストを実施。
コンテナログに出力されたトレース情報をClassAで検索し、以下の2行を検出。
Loaded ClassA C:\Interstage\J2EE\var\deployment\ijserver\kaz001\apps\j2eesample.ear\CartBean.jar by Application |
上記からClassAがEJBアプリケーションとWebアプリケーションの2箇所に保管されていることが判明。
クラスのバッティングが原因でServletからEJBアプリケーションの呼び出しに失敗しているため、以下の対応を検討してください。
EJBアプリケーションとWebアプリケーションの両方に同じクラスが存在しないようにアプリケーションの構成を変更することができないか。
クラスローダの検索順番を“親が先”に設定することで回避可能か。
クラスローダの分離を“分離しない”に設定することで回避可能か。