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.

Foi útil?

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.

Veja também:

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top