EAR で OmniFaces を正しく使用する方法
-
21-12-2019 - |
質問
使いたい オムニフェイス 私のJave EE 7アプリケーションでは1.7。私のアプリケーションは、JAR と 細い戦争. 。JAR の一部は OmniFaces に依存しているため、OmniFaces アーティファクトは EAR 内に存在する必要がありますが、EAR 内には存在しません。 WEB-INF/lib
戦争中。
私のEARは次のようになります。
EAR
+-- lib
| +-- [some 3rd party JARs]
| `-- omnifaces.jar
+-- myEJBs.jar
`-- myWAR.war
こうやって言うと、OmniFaces コンバーター ( GenericEnumConverter
) は JSF に登録されていないため、機能しません。その理由が議論されている ここ そして ここ. 。基本的には JSF 2.0仕様 (セクション 11.5.1 注釈のクラスのスキャンの要件)、WAR のみ WEB-INF/lib
ディレクトリがスキャンされます。
そこで私の質問は次のとおりです。 アプリケーションに OmniFaces を含めるにはどうすればよいですか?
それを 2 回含めます ( EAR/lib
とWAR WEB-INF/lib
)おそらく機能する可能性がありますが、不器用に感じます。少し前にRichFaces 4.3.5(同じ問題)で試しましたが、機能しませんでしたが、 IllegalArgumentException: duplicate key: class javax.faces.convert.ByteConverter
.
解決
OmniFaces は、JSF、EL、およびサーブレット API に依存する JSF ユーティリティ ライブラリです。これらは通常、EAR ではなく WAR 内でのみ使用できます。さらに、EJB (ビジネス サービス一般) は、JSF、EL、サーブレット API などの特定のフロントエンド API に依存することは想定されていません。JAX-RS、Spring MVC などの他のフロントエンドでは再利用できなくなります。
JSF ユーティリティとコンポーネント ライブラリ (OmniFaces や PrimeFaces など) は、EAR ではなく WAR に配置する必要があります。こちらも参照 インストール OmniFaces ホームページのセクション:
OmniFaces は WAR ライブラリ (Web フラグメント ライブラリ) として設計されているため、WAR 独自の Web アプリのランタイム クラスパスの他の場所に配置することはできません。
/WEB-INF/lib
, 、EARなど/lib
またはサーバーまたは JRE 自体の/lib
. 。OmniFaces JAR ファイルがこの方法で誤って配置された場合、Web アプリケーションは OmniFaces にバンドルされた JSF/CDI アノテーション付きクラスを見つけることができず、デプロイ時または実行時にこれに関連する例外をスローします。これを解決するには、OmniFaces を WAR に戻します。/WEB-INF/lib
.