3

Java EE 7 アプリケーションでOmniFaces 1.7を使用したいと考えています。私のアプリケーションは、JAR とスキニー WARを含む EAR です。一部の JAR は OmniFaces に依存しているため、OmniFaces アーティファクトは EAR にある必要がありますがWEB-INF/lib、WAR にはありません。

私のEARは次のようになります。

EAR
 +-- lib
 |    +-- [some 3rd party JARs]
 |    `-- omnifaces.jar
 +-- myEJBs.jar
 `-- myWAR.war

このように説明すると、OmniFaces コンバーター ( などGenericEnumConverter) は JSF に登録されておらず、機能しません。この理由については、こちらこちらで説明しています。基本的に、JSF 2.0 仕様(セクション11.5.1 アノテーション用のクラスのスキャンに関する要件) に従って、WARsWEB-INF/libディレクトリのみがスキャンされます。

私の質問は次のとおりです。アプリケーションに OmniFaces をどのように含める必要がありますか?

それを 2 回 (EAR/libおよび WARsにWEB-INF/lib) 含めるとうまくいく可能性がありますが、ぎこちなく感じます。少し前にRichFaces 4.3.5(同じ問題)で試してみましたが、うまくいきませんでしたがIllegalArgumentException: duplicate key: class javax.faces.convert.ByteConverter.

4

1 に答える 1

4

OmniFaces は、JSF、EL、およびサーブレット API に依存する JSF ユーティリティ ライブラリです。これらの API は通常、EAR ではなく WAR 内でのみ使用できます。さらに、EJB (ビジネス サービス全般) は、JSF、EL、サーブレット API などの特定のフロントエンド API に依存することは想定されていません。JAX-RS、Spring MVC などの他のフロントエンドでは再利用できなくなります。

OmniFaces や PrimeFaces などの JSF ユーティリティおよびコンポーネント ライブラリは、EAR ではなく WAR に配置する必要があります。OmniFaces ホームページのインストールセクションも参照してください。

OmniFaces は WAR ライブラリ (Web フラグメント ライブラリ) として設計されているため/WEB-INF/lib、EAR/libやサーバーまたは JRE 自身のなど、WAR 自身の 以外の Web アプリケーションのランタイム クラスパスに配置することはできません/lib。OmniFaces JAR ファイルがこのように誤って配置されると、Web アプリケーションは OmniFaces にバンドルされた JSF/CDI アノテーション付きクラスを見つけることができず、デプロイまたは実行時にこれに関連する例外をスローします。それを解決するには、OmniFaces を WAR に戻し/WEB-INF/libます。

以下も参照してください。

于 2014-06-06T08:27:44.583 に答える