Atualize o JSF / Mojarra no JBoss AS / EAP / WildFly

Como faço para atualizar o Mojarra no servidor JBoss e dizer a ele para usar os JARs do Mojarra 2.x em vez do próprio JBoss jboss-jsf-api_2.1_spec-2.0.1.Final.jar como indicado no log de boot?

Se isso for relevante, estou usando atualmente o JBoss AS 7.1.

   

O procedimento abaixo se aplica ao JBoss AS 7.2+ , ao JBoss EAP 6.1+ e ao JBoss WildFly 8+ e assume que você tem controle total sobre a instalação e configuração do servidor. Isso atualiza a versão JSF padrão para todo o servidor:

  • Faça o download da API individual do Mojarra e dos arquivos impl (e, portanto, não do único arquivo javax.faces.jar ). A versão 2.1.x mais recente atual é 2.1.29 e a última versão 2.2.x atual é 2.2.14. Vamos supor que você queira atualizar para 2.2.x. Você pode baixá-los individualmente de seu repository Maven:
    • jsf-api-2.2.14.jar
    • jsf-impl-2.2.14.jar
  • Certifique-se de que o JBoss esteja desligado.
  • Atualize a API do JSF em /modules/system/layers/base/javax/faces/api/main :
    • Exclua ou faça backup do arquivo JAR antigo (NÃO o mantenha na mesma pasta, nem mesmo renomeado!).
    • Coloque o arquivo jsf-api-2.2.14.jar lá.
    • Abra o arquivo module.xml e edite para especificar o novo nome do arquivo como em
  • Atualize o JSF em /modules/system/layers/base/com/sun/jsf-impl/main :
    • Exclua ou faça backup do arquivo JAR antigo (NÃO o mantenha na mesma pasta, nem mesmo renomeado!).
    • Coloque o arquivo jsf-impl-2.2.14.jar lá.
    • Abra o arquivo module.xml e edite para especificar o novo nome do arquivo como em
  • Limpe os dados de cache / trabalho do JBoss apenas para ter certeza de que não há uma cópia antiga dos JARs de implementações anteriores penduradas lá, o que potencialmente colidiria apenas com os novos JARs:
    • Trash todo o conteúdo de /standalone/data (exceto pastas de dados personalizadas, como pastas contendo arquivos enviados, é claro)
    • Trash todo o conteúdo de /standalone/deployments
    • Trash todo o conteúdo de /standalone/tmp
  • Inicie o JBoss. Agora deve usar a nova versão do JSF para todas as implantações.

O mesmo procedimento se aplica ao JBoss AS 7.0 / 7.1 e ao JBoss EAP 6.0 , você só precisa navegar em /modules/* invés de /modules/system/layers/base/* , e você precisa explicitamente deletar o antigo arquivo .index lá , se houver (o JBoss irá criar automaticamente um). Além disso, se o module.xml na pasta da API não module.xml dentro de , será necessário adicioná-lo manualmente.

É importante notar que as versões Mojarra 2.2.x anteriores a 2.2.7 falharão no AS / EAP durante a implementação com a seguinte exceção: org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.faces.flow.builder.FlowDefinition . Você tem basicamente duas opções: fazer o downgrade para o Mojarra 2.1.x, ou atualizar para pelo menos o 2.2.7 ou mais recente.

Caso você queira atualizar para o Mojarra 2.3 , que não oferece mais uma variante de 2-JAR no Maven, você precisaria criar manualmente a variante 2-JAR com base no arquivo javax.faces.jar conforme este procedimento : Como instalar uma variante jar do JSF (javax.faces.jar) no WildFly .