В 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()
Теперь нужно переразвернуть приложение.