不能将EJB放在一个单独的jar中

时间:2015-05-08 18:26:17

标签: java java-ee netbeans glassfish ejb

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

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

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出现一个只有时间。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

解决方案:

  1. 您应该将application.xml中的JPALogic.jar引用为EJB模块。
  2. 您还可以添加" Class-Path:JPALogic.jar"在参考模块的META-INF / MANIFEST.MF中,以保证可见性。它可以是可见的,取决于容器。
  3. 像这样:

    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应用程序