【问题标题】:WAR module can't find EJB classes in EJB module in the same EARWAR 模块在同一 EAR 的 EJB 模块中找不到 EJB 类
【发布时间】:2017-03-15 18:17:03
【问题描述】:

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

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

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

发生的事情是我无法将该 EJB 注入到打包在 war 模块中的 JSF 托管 bean 中。 Netbeans 甚至没有看到课程。

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

任何帮助将不胜感激。 谢谢。

【问题讨论】:

  • 你的web.war的构建类路径中是否有ejb.jar?如果您的项目是基于 maven 的,那么 ejb.jar 是 web.war 项目的依赖项吗?
  • 你是对的,这是一个 maven 项目。我已将 EJB 模块添加为“提供”依赖项,它运行良好。谢谢。

标签: java-ee-6 glassfish-3 ear glassfish-4 payara


【解决方案1】:

好吧,正如@OndrejM 所建议的那样,我只在 WAR 的 pom.xml 中将 EJB 模块依赖添加为“已提供”,并且效果很好。

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

【讨论】:

  • 您可以将此答案标记为正确答案,即使它是您的答案;)
  • 考虑到这是您的答案,我认为您可以改进并再次发布。所以我可以接受并支持它。无论如何,谢谢。
【解决方案2】:

您应该从 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 服务器。

【讨论】:

  • 我正在使用 EJB 的无接口视图。
  • 说实话,按照@OndrejM 的建议,在 WAR 的 pom.xml 中添加 EJB 项目作为依赖项是有效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 2011-08-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
相关资源
最近更新 更多