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 |
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.jarとtest.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を同時に指定することは出来ないのだそうだ。
→ステートレスセッションビーンのアノテーションの付け方