代码之家  ›  专栏  ›  技术社区  ›  neu242

我可以让WAR依赖于jboss5.1中的JNDI条目吗?

  •  4
  • neu242  · 技术社区  · 16 年前

    作为从JBoss4.0.4升级到5.1的一部分,我正在尝试在成功部署EAR之后部署WAR。JBoss 5.x不支持 PrefixDeploymentSorter 就像4.x那样,这意味着我必须使用<视情况而定>在战争的jboss-web.xml中。

    cannot depend on the EAR 所以我选择最后部署的EJB。这个EJB提供了WAR需要的JNDI条目。

    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中的dependens片段:

    <depends>jboss.j2ee:ear=my-ear.ear,jar=mypackage-ejb.jar,name=MyFacadeBean,service=EJB3</depends>
    

    我的问题是:WAR在“startedejb:”之后立即开始部署,即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部署后热部署战争,一切都会按预期进行。

    我甚至想过在耳边使用一个虚拟EJB,并使用<模块顺序>严格</模块顺序>在jboss-app.xml中强制将其作为最后一个模块加载。但是,唉, JBoss 5.x does not support that

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

    1 回复  |  直到 16 年前
        1
  •  2
  •   Al Rodgers    13 年前

    下面是如何在JBoss5.1.x上实现这一点。

    首先,添加一个名为 aliases.txt 进入 META-INF META-INF/aliases.txt

    接下来,添加一个 jboss-dependency.xml 文件到 WAR的目录,包含以下内容(替代上面创建的别名的“我的耳朵”):

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

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

    推荐文章