作为从JBoss4.0.4升级到5.1的一部分,我正在尝试在成功部署EAR之后部署WAR。JBoss 5.x不支持
PrefixDeploymentSorter
就像4.x那样,这意味着我必须使用<视情况而定>在战争的jboss-web.xml中。
cannot depend on the EAR
所以我选择最后部署的EJB。这个EJB提供了WAR需要的JNDI条目。
2010-03-25 10:47:30,348 INFO [org.jboss.ejb3.session.SessionSpecContainer] (main) Starting jboss.j2ee:ear=my-ear.ear,jar=mypackage-ejb.jar,name=MyFacadeBean,service=EJB3
2010-03-25 10:47:30,350 INFO [org.jboss.ejb3.EJBContainer] (main) STARTED EJB: my.package.MyFacadeBean ejbName: MyFacadeBean
2010-03-25 10:47:30,371 INFO [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] (main) Binding the following Entries in Global JNDI:
my/MyFacade/local - EJB3.x Default Local Business Interface
my-ear/MyFacadeBean/local-my.package.MyFacade - EJB3.x Local Business Interface
下面是jboss-web.xml中的dependens片段:
<depends>jboss.j2ee:ear=my-ear.ear,jar=mypackage-ejb.jar,name=MyFacadeBean,service=EJB3</depends>
我的问题是:WAR在“startedejb:”之后立即开始部署,即MyFacadeBean绑定到JNDI之前,这会导致bean部署失败:
2010-03-25 10:47:39,068 ERROR [my.facade.FacadeFactory] (main) MyFacade not bound
2010-03-25 10:47:39,069 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[my.host.no].[/]] (main) StandardWrapper.Throwable
java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at my.freemarker.servlet.FreemarkerController.setupPojoServiceFactory(FreemarkerController.java:621)
[...]
Caused by: java.lang.RuntimeException: javax.naming.NameNotFoundException: MyFacade not bound
at my.facade.FacadeFactory.getFacade(FacadeFactory.java:61)
在WAR完成部署之后,MyFacade(嘲讽地?)继续部署并绑定JNDI条目。
如果我在EAR部署后热部署战争,一切都会按预期进行。
我甚至想过在耳边使用一个虚拟EJB,并使用<模块顺序>严格</模块顺序>在jboss-app.xml中强制将其作为最后一个模块加载。但是,唉,
JBoss 5.x does not support that
有没有办法依赖JNDI条目本身?有没有其他办法解决这个问题?