我可以做一个WAR依赖于JBoss的5.1 JNDI条目?
-
22-09-2019 - |
题
由于从JBoss的4.0.4到5.1升级的一部分,我想获得一个WAR部署后的EAR成功部署。 JBoss的5.x中不支持 PrefixDeploymentSorter 像4.x的那样,这意味着我必须使用<取决于>在WAR的JBoss-web.xml中。
看来我可以不依赖于EAR 一>本身,所以我挑的最后部署EJB来代替。此EJB提供JNDI条目的WAR需求。
这里的EJB作为它部署在WAR不存在从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>
我的问题是:战争开始后立即部署“STARTED EJB:”,即前MyFacadeBean势必JNDI,这会导致豆部署到失败:
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中不支持任何。卫生署!
有一个依赖于JNDI条目本身呢?是解决这个还有别的办法吗?
解决方案
下面是你如何可以在JBoss 5.1.x.实现这一目标
首先,添加一个名为aliases.txt
文件到您的耳朵META-INF
目录。这个文件应该只包含一个任意名称/标识符您的EAR一行。举例来说,如果你有我 - ear.ear,你META-INF/aliases.txt
文件可能包含“我的耳朵”。它只是需要的东西,也不由部署在同一台服务器上的其他应用程序中声明的任何其他别名冲突。
接下来,jboss-dependency.xml
文件添加到您的WAR的META-INF
目录,包含以下(subsituting“我的耳朵”为你上面创建的别名):
<dependency xmlns="urn:jboss:dependency:1.0">
<item whenRequired="Real" dependentState="Create">my-ear</item>
</dependency>
这将确保EAR在WAR之前展开。
此外,如果您尝试部署未经EAR存在的WAR,JBoss会记录一个明确的部署错误信息,告诉你有关丢失的依赖。