Как правильно использовать OmniFaces в EAR
-
21-12-2019 - |
Вопрос
я хочу использовать OmniFaces 1.7 в моем приложении Jave EE 7.Мое приложение представляет собой EAR, содержащее JAR-файлы и тощая война.Некоторые из моих JAR-файлов зависят от OmniFaces, поэтому артефакт OmniFaces должен находиться в EAR, а не в WEB-INF/lib
на войне.
Вот как выглядит мое УХО:
EAR
+-- lib
| +-- [some 3rd party JARs]
| `-- omnifaces.jar
+-- myEJBs.jar
`-- myWAR.war
Если я так говорю, конвертеры OmniFaces (например, GenericEnumConverter
) не зарегистрированы в JSF и не будут работать.Причина этого обсуждается здесь и здесь.В основном согласно Спецификация JSF 2.0 (раздел 11.5.1 Требования к сканированию классов на предмет аннотаций), только ВОЙНЫ WEB-INF/lib
каталог сканируется.
Итак, мой вопрос: как мне включить OmniFaces в мое приложение?
Включая его дважды (в EAR/lib
и ВОЙНЫ WEB-INF/lib
), возможно, могло бы сработать, но кажется неуклюжим.Некоторое время назад я попробовал это с RichFaces 4.3.5 (та же проблема), что не сработало, но привело к IllegalArgumentException: duplicate key: class javax.faces.convert.ByteConverter
.
Решение
OmniFaces — это служебная библиотека JSF с зависимостями от API-интерфейсов JSF, EL и Servlet, которые обычно доступны только внутри WAR, а не EAR.Более того, ваши EJB (бизнес-сервисы в целом) не должны иметь каких-либо зависимостей от конкретных интерфейсных API, таких как JSF, EL и API сервлетов.Это сделает их непригодными для использования в других интерфейсах, таких как JAX-RS, Spring MVC и т. д.
Вам необходимо поместить утилиту JSF и библиотеки компонентов, такие как OmniFaces и PrimeFaces, в WAR, а не в EAR.Смотрите также Монтаж раздел домашней страницы OmniFaces:
OmniFaces спроектирован как библиотека WAR (библиотека веб-фрагментов) и поэтому не может быть размещен где-либо в пути к классам среды выполнения веб-приложения за пределами собственной библиотеки WAR.
/WEB-INF/lib
, например, EAR/lib
или даже собственный сервер или JRE/lib
.Если файл JAR OmniFaces потерян таким образом, веб-приложение не сможет найти аннотированные классы JSF/CDI, связанные с OmniFaces, и выдать связанные с этим исключения во время развертывания или выполнения.Чтобы решить эту проблему, верните OmniFaces в WAR./WEB-INF/lib
.