- PR -

JBossでEJB - NoClassDefFoundError

1
投稿者投稿内容
EM
会議室デビュー日: 2003/08/19
投稿数: 7
投稿日時: 2004-01-24 11:47
JBoss4.0DR2を使って簡単なEJB(単純なSessionBean)を実行しようとしています。
EJBのデプロイは完了し、クライアント(mainメソッドのあるコンソールアプリケーション)を実行する際に、以下のようにNoClassDefFoundExceptionが発生します。

コード:

Exception in thread "main" java.lang.NoClassDefFoundError: javax/net/SocketFactory
at org.jnp.interfaces.NamingContextFactory.getInitialContext(NamingContextFactory.java:51)
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.init(Unknown Source)
at javax.naming.InitialContext.<init>(Unknown Source)
at EJBClient.main(EJBClient.java:9)



コンパイルは成功しており、実行時にJ2SEのコアライブラリ(javax.net)に含まれるSocketFactoryが見つからないと言われているのですが、どのような原因が考えられるでしょうか?

クライアント側ではJBossに付属の「jboss-j2ee.jar」、「jboss-all-client.jar」にクラスパスを通しています。
また、JBoss付属のjndi.propertiesもクラスパスに含まれるディレクトリに配置しています。

# コンパイル時のクラスパスと、実行時のクラスローダーのクラスパスが異なっているということでしょうか。



[ メッセージ編集済み 編集者: EM 編集日時 2004-01-24 11:49 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-01-24 12:28
引用:

EMさんの書き込み (2004-01-24 11:47) より:
コンパイルは成功しており、実行時にJ2SEのコアライブラリ(javax.net)に含まれるSocketFactoryが見つからないと言われているのですが、どのような原因が考えられるでしょうか?


SocketFactoryクラスはJ2SE1.4で導入されたクラスですが、実行環境のVMが1.3ということ
はないでしょうか。
EM
会議室デビュー日: 2003/08/19
投稿数: 7
投稿日時: 2004-01-24 14:08
ukさん、アドバイスありがとうございます。
おっしゃるとおりでした。
1.4をインストールしていたのですが、Oracleのインストール時にPATHを書き換えられていました。

で、SocketFactoryの件は解決したのですが、違うクラスのNoClassDefFoundErrorが出て困っています。
jboss-all-client.jarがクライアントに必要な全てのライブラリだと認識していたのですが。。。
例を挙げると、
org.jboss.system.ServiceMBeanSupportが見つからないと言われ、JBossのサーバー側のlibにあるjboss-systeml.jarにクラスパスを通しました。するとServiceMBeanSupportのエラーは消えたのですが、また違うjavax.management.NotificationBroadcasterSupportがないと言われます。

クライアント用のJARファイルはないのでしょうか?
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-01-24 14:30
引用:

org.jboss.system.ServiceMBeanSupportが見つからないと言われ、JBossのサーバー側のlibにあるjboss-systeml.jarにクラスパスを通しました。するとServiceMBeanSupportのエラーは消えたのですが、また違うjavax.management.NotificationBroadcasterSupportがないと言われます。


どうやらJMXのコンポーネントを呼び出しているようですが、普通クライアントから呼び出さ
れるものではないと思います。最初のエラーから考えて、InitialContextの取得に失敗して
いるようですが、デフォルトのInitialContextを取得しようとしていませんか? JBossは
使ったことありませんが、リモートのEJBをlookupするのなら、リモートのContextを参照
するようにしなければいけません。
EM
会議室デビュー日: 2003/08/19
投稿数: 7
投稿日時: 2004-01-24 14:43
ukさん、たびたびアドバイスありがとうございます。

引用:

ukさんの書き込み (2004-01-24 14:30) より:
デフォルトのInitialContextを取得しようとしていませんか? JBossは
使ったことありませんが、リモートのEJBをlookupするのなら、リモートのContextを参照するようにしなければいけません。



InitialContextを取得するコードは
コード:
InitialContext ctx = new InitialContext();


のように記述しておりますが、このクライアントと同じディレクトリに以下の記述のjndi.propertiesファイルを置いています。
コード:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp://localhost:1099



# JBossはローカルで動かしています。

上記jndi.propertiesファイルがJBossの提供するJNDIサーバーの設定だとの認識なのですが誤っているでしょうか。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-01-24 15:04
引用:

EMさんの書き込み (2004-01-24 14:43) より:
InitialContextを取得するコードは
コード:
InitialContext ctx = new InitialContext();


のように記述しておりますが、このクライアントと同じディレクトリに以下の記述のjndi.propertiesファイルを置いています。
コード:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp://localhost:1099




なるほど、ではカレントディレクトリにクラスパスは通っていますか?

引用:

# JBossはローカルで動かしています。


いや、同一のマシンでも別のVMならリモートです。
EM
会議室デビュー日: 2003/08/19
投稿数: 7
投稿日時: 2004-01-24 15:25
いろいろと調べていたのですが原因がわからず、JBoss3.2をダウンロードして試したところ、問題なく実行できました。
クライアントライブラリ以外は全て同じ環境、実行方法なので、どうもこのクライアントライブラリの辺りに問題があると思うのですが。。。

引用:

ukさんの書き込み (2004-01-24 15:04) より:
なるほど、ではカレントディレクトリにクラスパスは通っていますか?



大丈夫です。通っています。

JBoss3.2ではクライアント用ライブラリとして、jbossall-client.jar というファイルにだけクラスパスを通せばよいのですが、JBoss4.0では違うようです。
#jbossall-client.jarファイルもありません。
#代わりにjboss-all-client.jarというファイルがありますが、書いてきたようにダメでした。

ukさん、いろいろアドバイスありがとうございました。解決には至っていませんが、勉強になりました。
引き続き、調査してみますが、何か情報があればよろしくお願いします。

[ メッセージ編集済み 編集者: EM 編集日時 2004-01-24 15:27 ]
1

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