EJB依赖注入适用于EAR但不适用于JAR

时间:2012-07-05 13:52:18

标签: java dependency-injection ejb weblogic-10.x

环境

  • 两个带有远程接口的无状态EJB。 EJB1被注入EJB2。
 
    /// EJB1

    package com.xxx.layer1;

    @Remote
    public interface EJB1Remote {
    }

    @Stateless (mappedNamed="com.xxx.EJB1")
    public class EJB1 implements EJB1Remote {
    }


    /// EJB2

    package com.xxx.layer2;

    import com.xxx.layer1;

    @Remote
    public interface EJB2Remote {
    }

    @Stateless (mappedNamed="com.xxx.EJB2")
    public class EJB2 implements EJB2Remote {

        @EJB(mappedNamed="com.xxx.EJB1")
        EJB1Remote ejb1;
    }
  • EJB2还使用了一些可选包(在其MANIFEST中声明)

  • WebLogic应用程序服务器(10.3.3)

  • 两个EJB打包成两个单独的JAR文件

问题

如果将两个JAR文件打包到EAR文件中并进行部署,则依赖注入可以正常工作。但是,如果我单独部署它们,即使我首先部署EJB1并在Weblogic中验证了全局JNDI名称( com.xxx.EJB1#com.xxx.layer1.EJB1Remote ),EJB2的部署失败,出现 ClassNotFoundException:com.xxx.layer1.EJB1Remote

1 个答案:

答案 0 :(得分:0)

在这种情况下,每个单独的JAR文件都是WebLogic中的一个应用程序,每个应用程序都有自己的类加载器。因此,当单独部署JAR文件(未捆绑在EAR文件中)时,他们的类加载器不会在其他文件中看到类。

在这种情况下,我将EJB2的接口分成另一个JAR文件,并将其作为Optional Package部署,并将其引用添加到其他JAR文件的Manifest。