Como usar OmniFaces corretamente em um EAR
-
21-12-2019 - |
Pergunta
Eu quero usar OmniFaces 1.7 em meu aplicativo Jave EE 7.Minha aplicação é um EAR que contém JARs e um GUERRA magro.Alguns dos meus JARs têm dependência do OmniFaces, portanto, o artefato OmniFaces deve estar no EAR, mas não no WEB-INF/lib
na guerra.
Esta é a aparência do meu EAR:
EAR
+-- lib
| +-- [some 3rd party JARs]
| `-- omnifaces.jar
+-- myEJBs.jar
`-- myWAR.war
Quando digo desta forma, os conversores OmniFaces (como GenericEnumConverter
) não estão registrados no JSF e não funcionarão.A razão para isso é discutida aqui e aqui.Basicamente de acordo com o Especificação JSF 2.0 (seção 11.5.1 Requisitos para digitalização de classes para anotações), apenas as GUERRAS WEB-INF/lib
diretório é verificado.
Então minha pergunta é: como devo incluir OmniFaces em meu aplicativo?
Incluindo-o duas vezes (em EAR/lib
e GUERRAS WEB-INF/lib
) poderia funcionar, mas parece desajeitado.Eu tentei há algum tempo com RichFaces 4.3.5 (mesmo problema) que não funcionou, mas levou a IllegalArgumentException: duplicate key: class javax.faces.convert.ByteConverter
.
Solução
OmniFaces é uma biblioteca utilitária JSF com dependências de APIs JSF, EL e Servlet, que normalmente só estão disponíveis dentro de um WAR, não de um EAR.Ainda mais, seus EJBs (serviços de negócios em geral) não devem ter nenhuma dependência de APIs front-end específicas, como APIs JSF, EL e Servlet.Isso os tornaria inutilizáveis em outros front-ends, como JAX-RS, Spring MVC, etc.
Você precisa colocar utilitários JSF e bibliotecas de componentes, como OmniFaces e PrimeFaces, no WAR, não no EAR.Veja também Instalação seção da página inicial do OmniFaces:
OmniFaces foi projetado como uma biblioteca WAR (biblioteca de fragmentos da web) e, portanto, não pode ser colocado em outro lugar no caminho de classe de tempo de execução do webapp fora do próprio WAR.
/WEB-INF/lib
, como EAR/lib
ou mesmo do próprio servidor ou JRE/lib
.Quando o arquivo JAR do OmniFaces for perdido dessa maneira, o webapp não será capaz de localizar classes anotadas JSF/CDI agrupadas no OmniFaces e gerar exceções relacionadas a isso durante a implementação ou o tempo de execução.Para resolver isso, coloque de volta OmniFaces em WAR's/WEB-INF/lib
.