【问题标题】:Cannot deploy Java EE application referencing other EJB module无法部署引用其他 EJB 模块的 Java EE 应用程序
【发布时间】:2012-04-11 23:35:54
【问题描述】:

我有一个包含两个模块的应用程序(“CC”):CC-ejb 和 CC-war。 CC-ejb 包含 CC-war 使用的 JPA 实体和外观。此应用程序正常工作。现在我用两个模块创建另一个(“CINT”):CINT-ejb 和 CINT-war。在 web 模块中,我需要访问 CC-ejb 提供的对象。我使用 NetBeans 7.1 进行开发,使用 Glassfish 3.1.1 进行部署。


在 CC-ejb 中,我有一个界面:

/* ... */
import javax.ejb.Local;

@Local
public interface CallDetailsFacadeLocal {
        /* ... */

和一个实现类:

/* ... */
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
/* ... */
import tp.coma.data.entities.CallDetails;

@Stateless
public class CallDetailsFacade
            extends AbstractFacade<CallDetails>
            implements CallDetailsFacadeLocal {
    @PersistenceContext(unitName = "CC-ejbPU")
    private EntityManager em;
    /* ... */

在 CINT-war 中,我在我的一个 bean 中引用它:

/* ... */
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import tp.coma.data.beans.CallDetailsFacadeLocal;
/* ... */

@ManagedBean(name = "bookingController")
@SessionScoped
public class BookingController implements Serializable {
    /* ... */
    @EJB
    private CallDetailsFacadeLocal cdrFacade;
    /* ... */

部署 CINT 时(CC 已启动并运行)我收到以下消息:

部署期间发生错误:加载应用程序时出现异常:java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Ltp/coma/数据/beans/CallDetailsFacadeLocal;java.lang.IllegalStateException:ContainerBase.addChild:开始:org.apache.catalina.LifecycleException:java.lang.RuntimeException:java.lang.NoClassDefFoundError:Ltp/coma/data/beans/CallDetailsFacadeLocal;。有关详细信息,请参阅 server.log。

在服务器日志中我可以看到:

[#|2012-03-28T12:42:42.236+0200|SEVERE|glassfish3.1.1|global|_ThreadID=22;_ThreadName=Thread-2;|Class [ Ltp/coma/data/beans/CallDetailsFacadeLocal; ] 未找到。加载 [ 类 tp.coma.cint.jsf.BookingController ]|#] 时出错 [#|2012-03-28T12:42:42.252+0200|SEVERE|glassfish3.1.1|global|_ThreadID=22;_ThreadName=Thread-2;|Class [ Ltp/coma/data/beans/CallDetailsFacadeLocal; ] 未找到。加载 [ class tp.coma.cint.jsf.BookingController ]|#]

时出错

还有一些(八)异常堆栈跟踪。

我做错了什么??

【问题讨论】:

  • 好像你没有在第二个应用程序中包含CallDetailsFacadeLocal 类。
  • CC-ejb 项目添加到“项目属性”中的 CINT-war 库中,并设置为不包含在包中。
  • @ManielQ,至少必须包含接口。

标签: jakarta-ee glassfish ejb


【解决方案1】:

如果您使用 maven 进行构建,请阅读有关生成客户端 jar 以及您的 ejb jar 的信息。 http://maven.apache.org/plugins/maven-ejb-plugin/examples/ejb-client-dependency.html

如果您正在执行 ant 构建,请创建一个生成客户端 jar 的任务,只需包含 **/*Local.jar 或任何对您的项目有意义的模式。

不要忘记 *$1.class 文件,它们稍后会咬你。例如,如果您在 Enum 上进行切换,java 会生成一个匿名类,您最终会得到 XYZ$1.class,并且根据它是什么,您需要排除或包含它。在我的例子中,maven 包含了从会话 bean 实现生成的 $1.class。然后不同的类加载器因为这个匿名类有两个副本而生气。 (IllegalAccessError)

【讨论】:

    猜你喜欢
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多