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

Web applications 将EJB和接口拆分为单独的模块--部署失败,web-applications,netbeans,jakarta-ee,ejb-3.0,glassfish-3,Web Applications,Netbeans,Jakarta Ee,Ejb 3.0,Glassfish 3,我无法从EAR中“提取”接口和实体,以便从其他Web应用程序中使用它们: 我使用NetBeans 6.8和Glassfish 3.0.1 “Java类库”项目 包含所有实体和接口 “JavaEE应用程序”项目 类库添加到项目中,并打包到EAR中 包含EJB实现、MDB和测试 “Java Web应用程序”项目 类库添加到项目中,打包到WAR中 包含REST接口 当我构建和部署Web应用程序时,一切都进展顺利 当我构建JavaEE应用程序时,我可以看到包含的jar文件(接口、实体)。

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

  • 我使用NetBeans 6.8和Glassfish 3.0.1
  • “Java类库”项目
    • 包含所有实体和接口
  • “JavaEE应用程序”项目
    • 类库添加到项目中,并打包到EAR中
    • 包含EJB实现、MDB和测试
  • “Java Web应用程序”项目
    • 类库添加到项目中,打包到WAR中
    • 包含REST接口
当我构建和部署Web应用程序时,一切都进展顺利

当我构建JavaEE应用程序时,我可以看到包含的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注释,因此没有特定于bean的部署描述符:

mvs/core/ShopperService.java:

@Stateless
public class ShopperService implements ShopperServiceLocal, ShopperServiceRemote {
}
mvs/core/ShopperServiceLocal.java:

@Local
public interface ShopperServiceLocal {
}

“JavaEE应用程序”项目必须包含接口(当前无法在运行时加载这些接口,因此出现
NoClassDefFoundError
)。如果您想从另一个webapp调用ejb,请创建一个额外的“客户端”jar(仅具有接口)。

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

如果您不需要完整的EJB功能,那么EJBLite(EJB3.1附带)允许您只创建一个WAR文件,您可以将两者都放在其中。例如,这场战争可能包含您的EJB和servlet。这使您只需一个WAR文件就可以更轻松地进行部署。但EJBLite只有在您的EJB不需要提供任何远程接口时才有用


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

JAR的清单文件(META-INF/ejb-JAR.xml)是否包含对bean类的引用?@Achim:我使用的是EJB3,因此没有部署描述符。我相应地更新了我的帖子。你认为我应该使用部署描述符吗?注释是可以的。我只是想看看是否有冲突。好的,谢谢。因此,接下来的挑战只是保持“客户机”jar的同步,对吗?每当我对接口或实体进行更改时,我都需要再次将它们导出到客户机jar中。@Hank Yes。最佳实践是作为自动化构建的一部分(使用Maven或Ant)生成此客户机EJBJAR。这就解决了同步问题。带接口的JAR去哪里了?