作为从JBoss 4.0.4升级到5.1的一部分,我试图在成功部署EAR后部署WAR。 JBoss 5.x不支持像4.x那样的PrefixDeploymentSorter,这意味着我必须在WAR的jboss-web.xml中使用<,取决于>。我可以根据JBoss 5.1中的JNDI条目来制作WAR吗?
看来我自己是cannot depend on the EAR,所以我选择了最后部署的EJB。这个EJB提供了WAR需要的JNDI条目。
这里的EJB,因为它部署,当战争从deploy目录中没有:
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中取决于片段:
<depends>jboss.j2ee:ear=my-ear.ear,jar=mypackage-ejb.jar,name=MyFacadeBean,service=EJB3</depends>
我的问题是: WAR在“STARTED EJB:”之后立即开始部署,即在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后热部署WAR,则所有操作都按预期工作。
我甚至想这取决于在EAR的虚拟EJB,并使用<模块顺序的jboss-app.xml中>严格< /模块顺序>,迫使它加载作为最后一个模块。但唉,JBoss 5.x does not support that要么。卫生署!
有没有办法依赖于JNDI条目本身?有解决这个问题的其他方法吗?
太棒了,谢谢!我们的大部分客户现在已经转向AS7/EAP6,但这仍然很好。 – neu242 2012-12-06 12:32:27