WAR 模块在同一个 EAR 的 EJB 模块中找不到 EJB 类

WAR module can't find EJB classes in EJB module in the same EAR

嗯,我有一个具有以下结构的 EAR 项目:

EarSample
  - EarSample-ejb.jar
  - EarSample-web.war

在 EJB 模块中有一个没有接口(无视图接口)的简单无状态会话 bean。

发生的事情是我无法将 EJB 注入到 war 模块中打包的 JSF 托管 bean 中。 Netbeans 甚至看不到 class.

我已经尝试过 GF 3/4 和 Payara。

如有任何帮助,我们将不胜感激。 谢谢。

您应该从 EarSample-ejb.jar 模块中提取 EJB 接口并将它们放入单独的 jar 文件 EarSample-common.jar。此类存档应放置在 EarSample 内的 lib 文件夹中,因此可以从两个模块访问它。

结构应该如下所示:

EarSample
  EarSample-ejb.jar
  EarSample-web.war
  /lib/EarSample-common.jar

其背后的原因是符合 JSR 标准,一般来说 EAR 模块应该有单独的类加载器(默认情况下在 Glassfish 或 JBoss/Wildfly 中不受限制)。

如果您将提取提到的 EJB 接口以分离 maven 模块并将该工件添加到 ejb 和 web 模块作为编译范围依赖项,您的解决方案将适用于所有 JavaEE 6/7 服务器。

好吧,正如@OndrejM 所建议的,我只在 WAR 的 pom.xml 中添加了 EJB 模块依赖项作为 "provided",并且它运行良好。

    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>EarSample-ejb</artifactId>
        <version>${project.version}</version>
        <scope>provided</scope>
    </dependency>