- PR -

weblogicでNoClassDefFoundExceptionが発生しますが。

1
投稿者投稿内容
sumin
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 93
投稿日時: 2004-01-28 11:09
いつも勉強させて頂いてます。
WebLogic8.1を利用して開発中ですが少しはまってます。
warとjarを作成し、earを作ってDeployまでは上手く行きました。EJBもDeployされてWar層から呼べるのは確認しました。が、問題はEJBの中で使用するjarファイル内の普通のクラスをインスタンス化する際にNoClassDefFoundExceptionが発生することです。
warのMENIFESTファイルにはClass-pathにEJBのjarファイルを書いて置きました。WebLogicのクラスローダーを疑って見ましたがあまり間違った部分は見えてなかったですが。マニュアルも一通り読みましたがまだ解決できてません。

ご意見頂けますか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-01-28 11:19
EJB から Web アプリケーション内のクラスは見えません。
Web アプリケーションのクラスローダはデフォルトでは EJB を読み込むクラスローダの子として作られるからです。
[WebLogic Server J2EE アプリケーション クラスローディング]
http://edocs.beasys.co.jp/e-docs/wls/docs81/programming/classloading.html


・EJB の jar ファイルに必要なクラスを含める
・EJB の jar ファイルのマニフェストクラスパスに通す
・APP-INF/lib ディレクトリに必要な jar ファイルを配置する
のいずれかで解決するとおもいます。

ドキュメントではここが参考になると思います。
・[モジュールおよびアプリケーション間のクラス参照の解決]
http://edocs.beasys.co.jp/e-docs/wls/docs81/programming/classloading.html#1065667
sumin
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 93
投稿日時: 2004-01-28 12:17
ご返事ありがとうございます。
少し説明が間際らしかったですね。warでjarのEJBを呼び、EJBの中で同じjarの中のEJBではない普通のクラスをインスタンス化しようとしています。教えて頂いた資料は読んでましてその中でMENIFESTファイルにクラスパスを通しています。
が、上記のエラーが出てます。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-01-28 12:53
なるほど。
通常 EJB 内で、自分の jar ファイルに含まれているクラスは参照可能なはずです。
参照できないとすれば、EJB のクラスがシステムクラスパスに含まれていて、呼び出そうとしているクラスが EJB jar 内に含まれている場合でしょうか?

クラスローダ階層は以下のようになっていて、下位のクラスは上位のクラスから見えません。システムクラスで EJB のクラスが読み込まれてしまうと、アプリケーションのクラスが参照できなくなってしまう可能性があります。
コード:
システムクラスローダ

Lアプリケーションクラスローダ(EJB jar,rar)
LWebアプリケーションクラスローダ(war)


->よって、 Webアプリケーションから、 EJB jar に対してマニフェストクラスパスを通す必要はありません
起動時のクラスパスに余計なものが含まれていないかご確認ください。

特定のクラスがどのクラスローダで読み込まれているかは、
クラス名.class.getClassLoader().toString() とかで取得できます。
EJB 内でエラーが起きるコードの前で、 System.out.println("ClassLoader:"+this.getClass().getClassLoader()) としたら何が表示されますか?
->ClassLoader:weblogic.utils.classloaders.GenericClassLoader@.......
と表示されればいいのですが、
System.out.println("system ClassLoader:"+weblogic.Server.class.getClassLoader())
と同じもの
->system ClassLoader:sun.misc.Launcher$AppClassLoader@....
が表示されるようでしたらクラスパスに間違いがあります。
#その場合はデプロイ時に警告が出ているはずですが。


[ メッセージ編集済み 編集者: インギ 編集日時 2004-01-28 13:09 ]
sumin
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 93
投稿日時: 2004-01-28 13:47
なるほど、クラスローダーを確認するんですか?
今は外におりまして環境がないですが夕方やって見て結果を報告します。
1

スキルアップ/キャリアアップ(JOB@IT)