Иногда возникает необходимость использовать Liferay-сервис из нескольких различных портлетов. Приведу пример ситуации, где я с этим столкнулся, и решение проблемы. При работе с одним проектом, который состоит из портлета (для доступа в бд в портлете используется сервис) и хука (хук кастомизирует функционал некоторых стандартных портлетов Liferay), возникла необходимость сделать так, чтоб и в хуке можно было бы работать с базой через уже имеющийся сервис.
Это можно сделать следующим образом:
-
Файл сервисов ***service.jar переместить в папку tomcat-6.0.26/lib/ext/
-
Перезапустить сервер приложений
-
Развернуть портлет как обычно, но при этом из *war файла портлета нужно удалить файл с сервисами.
Неудобство заключается в том, что каждый раз при развертывании портлета прходится вручную удалять оттуда ***service.jar. Но этого можно избежать, внеся соответствующие изменения в ant скрипт build-common-plugin.xml (он находится в корне liferay pugins sdk), чтобы скорректировать процесс сборки как сервисов, так и портлета, и выполнять все эти действия автоматически:
<target name="build-service">
...
...
<zip
basedir="docroot/WEB-INF/service-classes"
destfile="docroot/WEB-INF/lib/${plugin.name}-service.jar"
/>
<!-- нужно добавить копирование -->
<copy file="docroot/WEB-INF/lib/${plugin.name}-service.jar" todir="${project.dir}/dist/" />
<delete dir="docroot/WEB-INF/service-classes" />
</target>
Приведеный выше фрагмент копирует сервисы в ../dist для удобства дальнейшего развертывания.
<target name="war" depends="compile">
...
...
<if>
<contains string="${app.server.dir}" substring="glassfish" />
<then>
<zip
basedir="${docroot.dir}"
destfile="${plugin.file}"
<!-- нужно ислючить jar из сборки -->
excludes="**/META-INF/context.xml,**/WEB-INF/lib/${plugin.name}-service.jar"
/>
</then>
<else>
<zip
basedir="${docroot.dir}"
destfile="${plugin.file}"
<!-- нужно ислючить jar из сборки -->
excludes="**/WEB-INF/lib/${plugin.name}-service.jar"
/>
</else>
</if>
</target>
Приведенный выше фрагмент исключает из *.war файл с сервисами.