我有一个包含两个模块的应用程序(“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] |#]
时出错
还有一些(八)异常堆栈跟踪。
我做错了什么?
答案 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)