作为从JBoss 4.0.4升级到5.1的一部分,我试图在成功部署EAR后部署WAR. JBoss 5.x不像47x那样支持
PrefixDeploymentSorter,这意味着我必须使用< depends>在WAR的jboss-web.xml中.
看来我cannot depend on the EAR本身,所以我选择了最后部署的EJB.此EJB提供WAR所需的JNDI条目.
这是在部署目录中缺少WAR时部署的EJB:
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,并使用< module-order> strict< / module-order>在jboss-app.xml中强制它作为最后一个模块加载.但是,唉,JBoss 5.x does not support that要么.卫生署!
有没有办法依赖JNDI条目本身?还有其他解决方法吗?
最佳答案 以下是在JBoss 5.1.x上实现此目的的方法.
首先,将名为aliases.txt的文件添加到EAR的META-INF目录中.此文件应该只包含一行,其中包含EAR的任意名称/标识符.例如,如果你有my-ear.ear,你的META-INF / aliases.txt文件可能包含’my-ear’.它只需要不会与部署在同一服务器上的其他应用程序声明的任何其他别名冲突.
接下来,将一个jboss-dependency.xml文件添加到WAR的META-INF目录中,其中包含以下内容(为您在上面创建的别名替换’my-ear’):
<dependency xmlns="urn:jboss:dependency:1.0">
<item whenRequired="Real" dependentState="Create">my-ear</item>
</dependency>
这将确保在WAR之前部署EAR.
此外,如果您尝试在没有EAR存在的情况下部署WAR,JBoss将记录一条清晰的部署错误消息,告诉您缺少的依赖项.