【问题标题】:Cannot put EJB in a separate jar不能将 EJB 放在单独的 jar 中
【发布时间】:2015-05-08 18:26:16
【问题描述】:

我有一个带有一些 JPA 逻辑的 EJB,我在我的 java EE 项目中使用了这些逻辑。 我没有在每个项目中复制该类,而是尝试将它放在一个单独的 jar 中,所以我有这样的结构:

  • 包含 EJB 和 WAR 项目的 Java EE 项目
  • JPALogic:其中包含 JPALogic 类的 JAR 项目
  • RemoteServices:带有 bean 接口的 JAR 项目
  • 服务:带有 bean 的 EJB 项目,包括作为库的 JPALogic 和 RemoteServices
  • 前端:带有前端的 WAR 项目,包括 RemoteServices 作为库。

JPALogic 仅在 EJB 项目中使用,在 Java EE 应用程序的其他部分中没有引用它。在 JPALogic 库中,我有我的 JPALogic bean:

@Stateless
@LocalBean
public class JPALogic {
  @Resource
  private EJBContext ejbContext;
  @Inject @ShardedPersistenceContext
  private EntityManager em;
  public JPALogic() {
  }
  [...lots of methods...]
}

如果 JPALogic 代码直接在 EJB 项目中,它可以完美运行,但是当我将它放在外部库部署时变得非常不稳定(netbeans 8 + glassfish 4)并且几乎每次部署都失败并出现此错误:

Exception while deploying the app [app] : Cannot resolve reference [Remote ejb-ref name=com.my.autenticacion.services.AutRolBackendServices/jpa,Remote 3.x interface =com.my.infraestructura.jpa.JPALogic,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session] because there are [2] ejbs in the application with interface com.my.infraestructura.jpa.JPALogic. 

我已经搜索过,但是当接口具有多个实现时,似乎会出现这种错误,但事实并非如此:只有一个名为“JPALogic”的bean,并且检查耳朵,JPALogic.jar 出现了一个只有时间。

我做错了什么?

【问题讨论】:

  • 类似的部署时间错误可能是由 web.xml 描述符中的错误配置引起的。您可能需要检查 EJB 项目的 web.xml 中是否有可选的 ejb-ref 标记 (docs.oracle.com/cd/E14571_01/web.1111/e13712/…),该标记可能已由您的 IDE 在创建 EJB 期间添加。

标签: java jakarta-ee netbeans glassfish ejb


【解决方案1】:

如果你的jar包含EJB注解(@Singleton、@Stateless、@Stateful组件定义注解),它不是一个简单的jar,而是一个ejb-jar,应该打包成一个模块。

解决方案:

  1. 您应该将 application.xml 中的 JPALogic.jar 作为 EJB 模块引用。
  2. 您还可以在引用模块的 META-INF/MANIFEST.MF 中添加“Class-Path: JPALogic.jar”以保证可见性。它可能是可见的,具体取决于容器。

像这样:

application.EAR
    META-INF/application.xml
        (must have a reference to the JPALogic.jar EJB module)
    JPALogic.jar (EJB-JAR)
    remoteservices.jar
    services.jar
        META-INF/MANITESF.MF Class-Path: JPALogic.jar
    remoteservices.jar
    frontend.war

有关更多详细信息,请参阅 JAVA EE 6 规范,第 EE.8 章:

  • EE.8.3.2 EJB 容器类加载要求
  • EE.8.5.2 部署 Java EE 应用程序

【讨论】:

    猜你喜欢
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多