null

IBM Websphere + Liferay + JSF

В Tune-IT мы делаем портлеты под Liferay c использованием Java Server Faces и делаем их хорошо. Один из наших заказчиков использует сервер приложений IBM Websphere в своей инфраструктуре. В данной заметке я хочу коротко описать последовательность действий, которые необходимо предпринять, чтобы портлеты, использующие JSF, корректно разворачивались и работали на портале Liferay, развернутом на сервере приложений IBM Websphere.

Начну с того, что в IBM Websphere 8.5 из коробки имеются две реализации JSF:

  • Sun Mojarra 1.2
    • Release: Apr, 2006
    • JSF version: 1.2.
  • Apache MyFaces 2.0
    • Release: Apr, 2010
    • JSF version: 2.0

По умолчанию используется MyFaces 2.0 и при развертывании приложения в логах можно наблюдать следующее:

*******************************************************************
*** WARNING: Apache MyFaces-2 is running in DEVELOPMENT mode.   ***
***                                         ^^^^^^^^^^^         ***
*** Do NOT deploy to your live server(s) without changing this. ***
*** See Application#getProjectStage() for more information.     ***
*******************************************************************

Использование Java Server Faces в порлетах под Liferay возможно благодоря проекту Liferay Faces Bridge. Данный проект транслирует запросы к портлету в запросы к JSF сервлету. В качестве библиотеки коспонентов мы используем Primefaces. На момент написания статьи нами использовалась версия 5.2. Использование данных библиотек накладывает ограничение на версию JSF: JSF 2.1. Ввиду этого возникает необходимость добавления данной версии реализации JSF в IBM Websphere 8.5.

Сначала необходимо установить данные библиотеки в Websphere. Для этого в Websphere импользуется механизм разделяемых библиотек (shared libraries). Необходимо добавить следующие библиотеки:

  • jsf-api-2.1.21.jar
  • jsf-impl-2.1.21.jar
  • liferay-faces-init-3.1.3-ga4.jar

Все действия по созданию разделяемой библиотеки и добавлению связи с конкретным приложением можно делать через административный web-интерфейс сервера приложений (по умолчанию ), однако гораздо удобнее воспользоватьсяч командным интерфесом утилиты wsadmin. Данная утилита позволяет писать команды на двух языках:

  • Jacl (будет удобнее тем, кто знаком с TCL)
  • Jython (выбор девелоперов)
C:\IBM\WebSphere\AppServer\profiles\AppSrv01\bin> ./wsadmin.bat -lang jython

Сначала нужно получить узел, который мы собираемся конфигурировать. Выведем список всех узлов.

wsadmin>AdminConfig.list('Server')

Теперь получим id узла (myCell, myNode, myServer - смотрим в результате исполнения предыдущей команды)

wsadmin>n = AdminConfig.getid('/Cell:myCell/Node:myNode/Server:myServer/')
wsadmin>print n


Вывод должен быть не пустой. Скачиваем и кладем все jar-архивы по какому-нибудь пути, например, C:/IBM/WebSphere/AppServer/mojarra-2.1/. Далее создаем разделяемую библиотеку, для которой будет использоваться изолированный загрузчик классов:

wsadmin>import os
wsadmin>classPath = os.pathsep.join(["C:/IBM/WebSphere/AppServer/mojarra-2.1/jsf-api-2.1.21.jar", "C:/IBM/WebSphere/AppServer/mojarra-2.1/jsf-impl-2.1.21.jar", "C:/IBM/WebSphere/AppServer/mojarra-2.1/liferay-faces-init-3.1.3-ga4.jar"])
wsadmin>library = AdminConfig.create('Library', n, [['name', 'mojarra21'], ['classPath', classPath], ['isolatedClassLoader', 'true']])

Теперь привязываем библиотеку к нашему приложению appName

wsadmin>AdminTask.modifyJSFImplementation('appName', '[-implName "SunRI1.2"]')
wsadmin>deployment = AdminConfig.getid('/Deployment:appName/')
wsadmin>appDeploy = AdminConfig.showAttribute(deployment, 'deployedObject')
wsadmin>classLoad1 = AdminConfig.showAttribute(appDeploy, 'classloader')
wsadmin>AdminConfig.create('LibraryRef', classLoad1, [['libraryName', 'mojarra21']])
wsadmin>AdminConfig.modify(classLoad1, [['mode', 'PARENT_LAST']])

Сохраняем конфигурацию

wsadmin>AdminConfig.save()

Теперь нужно переразвернуть приложение.

Вперед