2010-03-25 31 views
4

作为从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条目本身?有解决这个问题的其他方法吗?

回答

2

下面是你如何在JBoss 5.1.x上实现这个功能。

首先,将名为aliases.txt的文件添加到EAR的META-INF目录中。这个文件应该只包含一行,并为您的EAR指定一个任意的名称/标识符。例如,如果您有我的ear.ear,您的META-INF/aliases.txt文件可能包含“我的耳朵”。它只是需要不会与部署在同一台服务器上的其他应用程序声明的其他别名冲突。

接下来,jboss-dependency.xml文件添加到META-INF目录你的战争中,包含以下(subsituting“我的耳朵”为你上面创建的别名):

<dependency xmlns="urn:jboss:dependency:1.0"> 
    <item whenRequired="Real" dependentState="Create">my-ear</item> 
</dependency> 

这将确保EAR部署在战争之前。另外,如果您尝试在没有EAR的情况下部署WAR,JBoss将记录一条清晰的部署错误消息,告诉您有关缺少的依赖关系。

+0

太棒了,谢谢!我们的大部分客户现在已经转向AS7/EAP6,但这仍然很好。 – neu242 2012-12-06 12:32:27

相关问题