无法将EJB放入单独的jar包中

4
我有一个包含JPA逻辑的EJB,我在我的Java EE项目中使用它。为了避免在每个项目中复制该类,我试图将其放在一个单独的jar文件中,因此我有以下结构:
  • Java EE项目,其中包括EJB和WAR项目
  • JPALogic:包含JPALogic类的JAR项目
  • RemoteServices:包含bean接口的JAR项目
  • Services:包含bean的EJB项目,包括JPALogic和RemoteServices作为库
  • Frontend:包含前端的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,并且在检查ear文件时,JPALogic.jar只出现一次。
我做错了什么吗?

类似的部署时间错误可能是由于您的web.xml描述符中的配置错误引起的。您可能需要检查EJB项目的web.xml文件,查看是否有可选的ejb-ref标签(http://docs.oracle.com/cd/E14571_01/web.1111/e13712/web_xml.htm#WBAPP565),这可能是在创建EJB时由IDE添加的。 - Aleksandr Erokhin
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接