我正在尝试将2个单独的WAR迁移到一个 EAR 。
在WebLogic 12.2.1上运行,因此Java EE 7(CDI 1.1和EJB 3.1)。
每个WAR都包含相同的JAR库,其中包含许多 @Stateless EJB 和 @Named CDI托管bean :
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 @Inject 都会失败,并出现以下异常:
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个这样的组合罐..)
在EJB和CDI正常工作的情况下获得EAR的最佳解决方案是什么?
答案 0 :(得分:1)
我最终了解到出了什么问题:
某些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。