2016-09-06 13 views
0

2つのWARを1つのEARに移行しようとしています。EARのCDI + EJBが失敗する:未対応の依存関係

Java EE 7(CDI 1.1およびEJB 3.1)のようにWebLogic 12.2.1で稼動します。 2 WARを個別に展開された古い状況では

状況

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 

と:

各WARには、多くの@Stateless EJBの@Named CDIは豆にを管理含む同じJARライブラリが含まれていますすべて正常に動作します。私はいくつかの必要な手順を実行した

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

  • に、包装の種類を変更し

    今、私は2 WARさんのようになります1つのEARファイル、にをパッケージ化しなければなりませんEJB のejb-cdi.jar EJBのとCDIを含むためejbModulとして構成されたEJB-cdi.jar

  • 豆を管理しますpom.xmlの電子は、EJB-cdi.jarなしスキニー戦争としてWAR1とWAR2構成のpom.xml
  • webModuleとしてWAR1とWAR2構成
  • を使用して、EJBルックアップが成功していることを保証しました@Stateless(にmappedName = "XX")@EJB(のbeanName = "XX")

通報

EJBルックアップEARが起動します。 EARファイル内のEJBのルックアップとCDIの注射はプレーンなWARファイルよりも完全に異なる処理されているようですいくつかは、読んだ後

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 

:起動時にすべての私のCDI @Inject sが次の例外で失敗します。

ejb-cdi.jarがマニフェストのクラスパス上にないので、マネージドBeanはわかりません。

私が試してみました:

  • は、クラスパスにEJB-cdi.jarを追加 - > EJBのルックアップが完全に失敗する - > EJBさんは今曖昧
  • メイクのejb-cdi.jar定期JAR再定義されています
  • /libのに余分な異なる分類器とのejb-cdi.jarを追加 - > EJBさんは現在曖昧

を定義している(私は簡素化しましたので、私はJARを再編成する必要はありません願っています状況と実際にそのような結合された瓶は1つ以上です。)

EJBとCDIが正しく動作するEARを取得する最適なソリューションは何でしょうか?

+0

古典的なクラス読み込みの問題のようです。 WARアーカイブ内のBeanにアクセス(注入)しようとしているEJBアーカイブ内から推測してみましょうか? – Siliarus

+0

私はそれが答えではないことを知っていますが、...あなたはEARからWARにパッケージを移すことができますか? –

答えて

0

私は最後は私が何が悪かったのか理解:

いくつかのEJBのとCDIは、Beanが同じEJB-JAR cdi.jarにあった管理。 JARのいくつかの再構成が行われました。すべてのEJBを1つのJARに入れ、ejbModuleとして/に入れます。このejbModuleには、CDIマネージドBeanが含まれていませんでした。

CDIマネージドBean JARは、skinnyWar設定のMaven-War-Pluginが何を決定したかによって、WARまたは/ lib内で終了しましたが、どちらの方法も有効でした。

だから、答えはこれです:

は、EJBを再編成し、CDIは、適切に豆を管理し、別のJARファイルに入れとのejbModuleとしてEJB jarをマークします。

関連する問題