JBoss5.1.0GA上で管理されるリモートインタフェースをlookupしようとしたら、エラーになった。
Caused by: java.lang.ClassCastException: javax.naming.Reference cannot be cast to (Beanインタフェース名)
調べるとJBossのバージョン間で互換性がないだとか、同じエラーでも色々原因はあるようなんだけど、どうもjbossall-client.jar(このjar自体は他のjarを参照するだけなので、実際はこの中が参照しているjar群)とjnpserver.jarだけをクラスパスに含めると、不足があり、上記エラーになってしまう模様。
ただし、JBossのインストールフォルダの下にあるjar(commonとlib)を片っ端からクラスパスに含めるとうまく行く。
つまり、「何か」必要なjarがクラスパスにあるかどうかによって、うまくlookupできるかどうかが変わっているようだ。
で、今回のケースだと、http://www.coderanch.com/t/454071/java-EJB-SCBCD/certification/javax-naming-Reference-cannot-cast を参考に、クライアント側で最低限必要なjarは以下であることが分かった。
- concurrent.jar
- ejb3-persistence.jar
- jboss-aop.jar
- jboss-common-core.jar
- jboss-ejb3-common.jar
- jboss-ejb3-core.jar
- jboss-ejb3-proxy-clustered.jar
- jboss-ejb3-proxy-impl.jar
- jboss-ejb3-proxy-spi.jar
- jboss-ejb3-security.jar
- jboss-integration.jar
- jboss-javaee.jar
- jboss-logging-spi.jar
- jboss-remoting-aspects.jar
- jboss-remoting.jar
- jboss-security-spi.jar
- jbosssx.jar
- jboss-transaction-aspects.jar
- jnpserver.jar
人海戦術で調べた所、今回のエラーに関して肝になっているのはjboss-ejb3-proxy-impl.jarで、このjarはjbossal-client.jarからも参照されていないにも関わらず、クラスパスから抜けているとClassCastExceptionが起こってしまう。なんでかは詳しくみていないけど。
ともあれ、実際にクライアントアプリをパッケージングする時も上記のjarだけを含めればよいことが分かったので、パッケージファイル等々も少しダイエットできそうだ。