我有一个在Java EE项目中使用的带有某些JPA逻辑的EJB。
我没有在每个项目中都复制类,而是尝试将其放在单独的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仅出现一次。

    我做错了吗?

    最佳答案

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

    解:

  • 您应该将application.xml中的JPALogic.jar作为EJB模块引用。
  • 您还可以在引用模块的META-INF / MANIFEST.MF中添加“类路径: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应用程序
  • 07-26 03:29