EAR 中的 CDI + EJB 失败:不满足的依赖关系

CDI + EJB in EAR fails: Unsatisfied dependencies

我正在尝试将 2 个单独的 WAR 迁移到一个 EAR

运行 在 WebLogic 12.2.1 上,因此 Java EE 7(CDI 1.1 和 EJB 3.1)。

每个 WAR 包含相同的 JAR 库,其中包含许多 @Stateless EJB 的@Named CDI managed beans:

情况

WAR1
|- WEB-INF/lib/ejb-cdi.jar      (type=jar)
|- WEB-INF/lib/**.jar

WAR2
|- WEB-INF/lib/ejb-cdi.jar      (type=jar)
|- WEB-INF/lib/**.jar

在旧情况下,2 个 WAR 是单独部署的,一切正常。

现在,我必须将 2 个 WAR 打包成 1 个 EAR 文件,它看起来像这样:

EAR
|- WAR1.war                     (skinny, without ejb-cdi.jar)
|- WAR2.war                     (skinny, without ejb-cdi.jar)
|- ejb-cdi.jar                  (type=ejb)
|- lib/**.jar

我已经执行了几个必需的步骤:

问题

EJB 查找工作并且 EAR 启动。在启动过程中,我的所有 CDI @Injects 都失败了,并出现以下异常:

org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied
dependencies for type MyBean with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject private my.package.Foo.myBean

经过一些阅读,似乎 EAR 文件中的 EJB 查找和 CDI 注入的处理方式与普通 WAR 文件中的处理方式完全不同。

我假设因为 ejb-cdi.jar 不在清单中的类路径上,所以托管 bean 是未知的。

我尝试过的:

(我希望我不必重新组织 JAR,因为我已经简化了情况并且实际上有超过 1 个这样的组合 jar..)

获得 EJB 和 CDI 正常工作的 EAR 的最佳解决方案是什么?

我终于明白哪里出了问题:

一些 EJB 和 CDI 管理的 bean 在同一个 ejb-cdi.jar JAR 中。 对 JAR 进行了一些重组,将所有 EJB 放在一个 JAR 中,将其作为 ejbModule 放在 / 中。此 ejbModule 不再包含任何 CDI 管理的 bean。

CDI 管理的 bean JAR 最终位于 WAR 或 /lib 中,具体取决于带有 skinnyWar 设置的 maven-war-plugin 的决定,但两种方式都有效。

所以,答案是这样的:

适当地重新组织 EJB 和 CDI 管理的 bean,将它们放在单独的 JAR 中并将 EJB jar 标记为 ejbModule。