Обновление JSF/Mojarra в JBoss AS/EAP/WildFly

Как обновить Mojarra на сервере JBoss и сказать, что он использует предоставленные JAR Mojarra 2.x вместо собственного JBoss jboss-jsf-api_2.1_spec-2.0.1.Final.jar, как указано в журнале запуска?

Если это актуально, в настоящее время я использую JBoss AS 7.1.

Ответ 1

Ниже приведена процедура JBoss AS 7.2 +, JBoss EAP 6.1 + и JBoss WildFly 8 +, и предполагается, что вы полный контроль над установкой и настройкой сервера. Это обновляет версию сервера по умолчанию:

  • Загрузите отдельную Mojarra API и impl (и, следовательно, не единственный файл javax.faces.jar). Текущая версия 2.1.x - 2.1.29, а текущая версия 2.2.x - 2.2.14. Предположим, что вы хотите перейти на 2.2.x. Вы можете загрузить их отдельно из своего репозитория Maven:
  • Убедитесь, что JBoss отключен.
  • Обновите API JSF в /modules/system/layers/base/javax/faces/api/main:
    • Удалите или создайте резервную копию старого JAR файла (не храните его в одной папке, даже не переименовывая!).
    • Вставьте jsf-api-2.2.14.jar файл там.
    • Откройте module.xml файл и отредактируйте <resource-root>, чтобы указать новое имя файла, как в <resource-root path="jsf-api-2.2.14.jar"/>
  • Обновить JSF impl в /modules/system/layers/base/com/sun/jsf-impl/main:
    • Удалите или создайте резервную копию старого JAR файла (не храните его в одной папке, даже не переименовывая!).
    • Вставьте jsf-impl-2.2.14.jar файл там.
    • Откройте module.xml файл и отредактируйте <resource-root>, чтобы указать новое имя файла, как в <resource-root path="jsf-impl-2.2.14.jar"/>
  • Очистить кеш/рабочие данные JBoss, чтобы убедиться, что там нет старой копии JAR от предыдущих развертываний, которые потенциально могут столкнуться только с новыми JAR:
    • Загрузите все содержимое /standalone/data (за исключением специализированных папок данных, таких как папка с загруженными файлами, конечно)
    • Содержимое всех тэгов /standalone/deployments
    • Содержимое корзины /standalone/tmp
  • Запустите JBoss. Теперь он должен использовать новую версию JSF для всех развертываний.

Эта же процедура применяется к JBoss AS 7.0/7.1 и JBoss EAP 6.0, вам нужно всего лишь просмотреть /modules/* вместо /modules/system/layers/base/*, и вам нужно чтобы явно удалить старый файл .index там, если таковой имеется (JBoss будет автозаписывать один). Кроме того, если module.xml в папке API пропускает <module name="com.sun.jsf-impl"/> внутри <dependencies>, вам необходимо вручную добавить его.

Важно отметить, что версии Mojarra 2.2.x старше 2.2.7 не удаются в AS/EAP во время развертывания со следующим исключением: org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.faces.flow.builder.FlowDefinition. У вас есть в основном 2 варианта: переход на Mojarra 2.1.x или обновление до, по меньшей мере, 2.2.7 или новее.

Если вы хотите перейти на Mojarra 2.3, который больше не предлагает вариант 2-JAR на Maven, вам нужно вручную создать вариант 2-JAR на основе javax.faces.jar в соответствии с этой процедурой: Как установить один jar-вариант JSF (javax.faces.jar) в WildFly.