【问题标题】:Splitting EJBs and interfaces into separate module -- deployment fails将 EJB 和接口拆分为单独的模块——部署失败
【发布时间】:2011-02-01 18:51:59
【问题描述】:

我在关注 this guide 以从我的 EAR 中“提取”我的接口和实体以从另一个 Web 应用程序中使用它们时遇到问题:

  • 我使用 NetBeans 6.8 和 Glassfish 3.0.1
  • “Java 类库”项目
    • 包含所有实体和接口
  • “Java EE 应用程序”项目
    • 类库添加到项目中,打包到EAR中
    • 包含 EJB 实现、MDB、测试
  • “Java Web 应用程序”项目
    • 添加到项目中的类库,打包到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 注释,所以没有特定于 bean 的部署描述符:

mvs/core/ShopperService.java:

@Stateless
public class ShopperService implements ShopperServiceLocal, ShopperServiceRemote {
}

mvs/core/ShopperServiceLocal.java:

@Local
public interface ShopperServiceLocal {
}

【问题讨论】:

  • JAR 的清单文件 (META-INF/ejb-jar.xml) 是否包含对您的 bean 类的任何引用?
  • @Achim:我使用的是 EJB3,因此没有部署描述符。我相应地更新了我的帖子。你认为我应该改用部署描述符吗?
  • 注释很好。我只是想检查是否可能存在冲突。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 好的,谢谢。因此,挑战只是保持“客户端” jar 同步,对吗?每当我对接口或实体进行更改时,我都需要再次将它们导出到客户端 jar 中。
    • @Hank 是的。最佳实践是生成此客户端 ejb-jar 作为自动构建的一部分(使用 Maven 或 Ant)。这解决了同步问题。
    • 带接口的 JAR 去哪儿了?
    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 2015-11-06
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多