将EJB和接口拆分为单独的模块 - 部署失败

时间:2010-03-28 16:59:07

标签: web-applications netbeans java-ee ejb-3.0 glassfish-3

我无法跟踪this guide从我的EAR中“提取”我的接口和实体,以便从其他Web应用程序中使用它们:

  • 我使用NetBeans 6.8和Glassfish 3.0.1
  • “Java类库”项目
    • 包含所有实体和接口
  • “Java EE Application”项目
    • 将类库添加到项目中,打包到EAR中
    • 包含EJB实现,MDB,测试
  • “Java Web Application”项目
    • 添加到项目中的类库,打包成WAR
    • 包含REST接口

当我构建和部署Web应用程序时,一切顺利。

当我构建Java EE应用程序时,我可以看到包含的jar文件(接口,实体)。但是当我尝试部署EAR时,Glassfish使用java.lang.NoClassDefFoundError错误拒绝它:

[#|2010-03-28T18:25:59.875+0200|WARNING|glassfishv3.0|javax.enterprise.system.tools.deployment.org.glassfish.deployment.common|_ThreadID=28;_ThreadName=Thread-1;|Error in annotation processing: java.lang.NoClassDefFoundError: mvs/core/StoreServiceLocal|#]

[#|2010-03-28T18:25:59.876+0200|SEVERE|glassfishv3.0|javax.enterprise.system.core.com.sun.enterprise.v3.server|_ThreadID=28;_ThreadName=Thread-1;|Exception while deploying the app
java.lang.IllegalArgumentException: Invalid ejb jar [CoreServer]: it contains zero ejb. 
Note: 
1. A valid ejb jar requires at least one session, entity (1.x/2.x style), or message-driven bean. 
2. EJB3+ entity beans (@Entity) are POJOs and please package them as library jar. 
3. If the jar file contains valid EJBs which are annotated with EJB component level annotations (@Stateless, @Stateful, @MessageDriven, @Singleton), please check server.log to see whether the annotations were processed properly.

'mvs / core / StoreServiceLocal'是一个在库jar文件中定义的接口。

我做错了什么?

我正在使用EJB3 Annotations,因此没有特定于bean的部署描述符:

MVS /核心/ ShopperService.java:

@Stateless
public class ShopperService implements ShopperServiceLocal, ShopperServiceRemote {
}

MVS /核心/ ShopperServiceLocal.java:

@Local
public interface ShopperServiceLocal {
}

2 个答案:

答案 0 :(得分:4)

您的“Java EE应用程序”项目必须包含接口(当前无法在运行时加载,因此NoClassDefFoundError)。如果要从另一个Web应用程序调用EJB,请创建一个额外的“客户端”jar(仅使用接口)。

答案 1 :(得分:1)

我不确定您上面列出的EAR文件的详细结构。 “内部”EAR文件应该是一个WAR文件(对于Web容器)和另一个包含EJB的JAR文件(对于EJB容器)。两者都必须了解EJB接口,因为它们的适当容器具有单独的类加载器。

如果您不需要完整的EJB功能,那么EJB lite(EJB 3.1附带)允许您只创建一个WAR文件,您可以将其放入其中。例如,此WAR可以包含您的EJB和servlet。这使您只需一个WAR文件即可轻松部署。但是EJB EJB仅在您的EJB不需要提供任何远程接口时才有用。

如果您需要EJB的远程接口,那么EAR文件是正确的方法。此EAR文件应包含用于Web目的的WAR文件和用于EJB定义的JAR文件。