S-JIS[2008-08-15/2008-11-23] 変更履歴

JBoss Application Server 4.2.3.GA

JBossAS4.2.3はJDK1.6版も提供されている。(4.2.2まではJDK1.5)

JDK1.6版ではJDBC4.0も使えるようになっているらしいが、あくまで実験段階ということらしい。


ソース

JBossAS4.2.3のクラスのソースの場所のメモ。[2008-11-23]
(ソースは、JBossのサイトからJBoss本体と同様にダウンロードできる)

クラス jar ソース 備考
org.jboss.Main JBOSS_HOME/bin/run.jar jboss-4.2.3.GA-src/system/src/main/ run.batで実行されるmain()のあるクラス。
HttpServlet JBOSS_HOME/server/default/lib/
servlet-api.jar
jboss-4.2.3.GA-src/thirdparty/jboss/web/lib/jbossweb-src.zip  
Parameters JBOSS_HOME/server/default/deploy/
jboss-web.deployer/jbossweb.jar
jboss-4.2.3.GA-src/thirdparty/jboss/web/lib/jbossweb-src.zip  
javax.ejb.* JBOSS_HOME/server/default/lib/
jboss-ejb3x.jar
jboss-4.2.3.GA-src/ejb3x/src/main/ EJB3

EJB3.0?

JBossAS4.2.3ではEJB3.0のアノテーションが使える。が、WebLogic Server10.0JとはJNDIへの登録のされ方などが異なる。
これはJBoss4.2.3がJavaEE5に完全準拠していないだけなのか、JavaEEの実装依存なのか、どっちだろう…?
ステートレスセッションビーンのアノテーションの付け方

EJB3をデプロイするには、deployディレクトリー直下に「ejb_sample.jar」とい う名前のディレクトリー(拡張子「.jar」)を作って、その下にEJB関連のclassファイルを置けばよい。

>cd %JBOSS_HOME%\server\default\deploy
C:\jboss\jboss-4.2.3.GA\server\default\deploy>tree /f
〜
├─ejb_sample.jar
│  └─jp
│      └─hishidama
│          └─sample
│              ├─ejb
│              │      EjbSampleBean.class
│              │      
│              └─stateless
│                      EjbSample.class
〜
├─test.war
│  │  sample.html
│  │  sample.jsp
│  │  
│  └─WEB-INF
│      │  web.xml
│      │  
│      └─classes
│          └─jp
│              └─hishidama
│                  └─sample
│                      └─servlet
│                              EjbServlet.class

上記の様に置けば、自動的にデプロイされる。

この例ではejb_sample.jar(EJB)とtest.war(ウェブ)がデプロイされる。


EjbServletはウェブ画面からEJB3経由でEjbSampleBeanを呼び出す実験をしたクラスなのだが、 サーブレットからはlocalでもremoteでも呼び出せる。
サーブレットとEJBは同一のJavaVMで動いている為。

したがって、ejb_sample.jartest.warでは、同一のクラス(上記で言えばEjbSample)を片方にしか置いてはいけない。
両方にあるとクラスのロードが別々に行われ、lookup()の戻り値のキャストで失敗する。

java.lang.ClassCastException: $Proxy64 cannot be cast to jp.hishidama.sample.stateless.EjbSample
import jp.hishidama.sample.stateless.EjbSample;

	EjbSample sample = (EjbSample)ctx.lookup("jp/hishidama/sample/ejb/EjbSample/local");

パッケージが同じで同名のクラスでも、クラスローダー(ロード元のjarファイル?)が違えば別クラス扱いなので。


JBossAS4.2.3では、インターフェースやEJBに@Localと@Remoteを同時に付けるとデプロイ時にエラーになる。

java.lang.RuntimeException: An exception occurred initialising interceptors for class jp.hishidama.sample.ejb.EjbSampleBean.equals
        at org.jboss.ejb3.interceptor.EJB3InterceptorsFactory.createPerJoinpoint(EJB3InterceptorsFactory.java:108)
〜
        at org.jboss.Main$1.run(Main.java:508)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.RuntimeException: @Remote and @Local may not both be specified on the same interface
 "interface jp.hishidama.sample.stateless.EjbSample" per EJB3 Spec 4.6.7, Bullet 5.4
        at org.jboss.ejb3.ProxyFactoryHelper.getLocalInterfaces(ProxyFactoryHelper.java:244)
        at org.jboss.ejb3.interceptor.EJB3InterceptorsFactory.getBusinessInterfaces(EJB3InterceptorsFactory.java:172)
〜
--- MBeans waiting for other MBeans ---
ObjectName: jboss.j2ee:service=EJB3,module=ejb_sample.jar
  State: FAILED
  Reason: java.lang.RuntimeException: An exception occurred initialising interceptors for class jp.hishidama.sample.ejb.EjbSampleBean.equals

--- MBEANS THAT ARE THE ROOT CAUSE OF THE PROBLEM ---
ObjectName: jboss.j2ee:service=EJB3,module=ejb_sample.jar
  State: FAILED
  Reason: java.lang.RuntimeException: An exception occurred initialising interceptors for class jp.hishidama.sample.ejb.EjbSampleBean.equals

かなり大量にスタックトレースが出るが、一番上や最後の方のメッセージ「.equals」に目を奪われると負け。(equalsに何の意味があるのかは不明)

重要なのは真ん中辺りにあるCaused by
EJB3仕様4.6.7(実は4.6.6の間違いらしいでは@Remoteと@Localを同時に指定することは出来ないのだそうだ。
ステートレスセッションビーンのアノテーションの付け方


JBossASへ戻る / Java目次へ行く / Javaサーブレットへ行く
メールの送信先:ひしだま