无法部署引用其他EJB模块的Java EE应用程序

时间:2012-03-28 11:23:03

标签: java-ee glassfish ejb

我有一个包含两个模块的应用程序(“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中,我在我的一个豆子中引用它:

/* ... */
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 / data / beans / CallDetailsFacadeLocal; java.lang.IllegalStateException:ContainerBase.addChild:start: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; _TreadName = Thread-2; | Class [Ltp / coma / data / beans / CallDetailsFacadeLocal; ] 未找到。加载[class tp.coma.cint.jsf.BookingController] |#时出错   [#| 2012-03-28T12:42:42.252 + 0200 | SEVERE | glassfish3.1.1 | global | _ThreadID = 22; _TreadName = Thread-2; | Class [Ltp / coma / data / beans / CallDetailsFacadeLocal; ] 未找到。加载[class tp.coma.cint.jsf.BookingController] |#]

时出错

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

我做错了什么?

1 个答案:

答案 0 :(得分: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)