deployment - 我可以使 WAR 依赖于 JBoss 5.1 中的 JNDI 条目吗?

标签 deployment jndi war jboss5.x ear

作为从 JBoss 4.0.4 升级到 5.1 的一部分,我试图在 EAR 成功部署后部署 WAR。 JBoss 5.x 不支持 PrefixDeploymentSorter就像 4.x 一样,这意味着我必须在 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 绑定(bind)到 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 愉快地( mock 地?)继续部署并绑定(bind) JNDI 条目。

如果我在 EAR 部署后热部署 WAR,一切都会按预期工作。

我什至想过依赖 EAR 中的虚拟 EJB,并在 jboss-app.xml 中使用 strict 来强制它作为最后一个模块加载。但是,唉,JBoss 5.x does not support that任何一个。嗬!

有没有办法依赖 JNDI 条目本身?还有其他方法可以解决这个问题吗?

最佳答案

以下是在 JBoss 5.1.x 上实现此目的的方法。

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

接下来,添加 jboss-dependency.xml文件到META-INF WAR 目录,包含以下内容(用“my-ear”代替您在上面创建的别名):

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

这将确保 EAR 在 WAR 之前部署。

此外,如果您尝试在没有 EAR 的情况下部署 WAR,JBoss 将记录一条清晰的部署错误消息,告诉您缺少的依赖项。

关于deployment - 我可以使 WAR 依赖于 JBoss 5.1 中的 JNDI 条目吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2515235/

相关文章:

java - 验证jboss部署期间的错误。如何解决这个问题?

java - 如何使用 jndi 验证目录(LDAP 或 AD)中是否存在对象?

Java jar应用程序和java web应用程序的通信和实现

logging - 会在heroku部署日志中删除..

ios - 难以置备iPad应用程序以在iPad上进行测试

java - 如何通过 JNDI works 使用 DataSource?

java - Ant javac : package does not exist

Java部署工具和gxjarscanner

mongodb - 在 AWS EC2 实例上找不到 MongoDump 命令

jdbc - 使用 WebSphere Liberty Profile 8.5 设置数据源