Существует достаточно широкий набор инструментов разработки плагинов для Liferay Portal. "Каноническим" вариантом является связка Liferay Plugins SDK + Liferay IDE (основанная на Eclipse), но возможны и другие варианты - например, Maven + NetBeans. Тем не менее, достаточно часто возникает необходимость собрать плагин для Liferay, не запуская IDE (т.е. используя только командную строку). В этой заметке я рассмотрю решение этой задачи под своим рабочим окружением - сейчас это Ubuntu 13.04, но, скорее всего, она может оказаться полезной и для пользователей других операционных систем.
Исходные данные
Итак, мы имеем исходники некоего плагина для Liferay, которые нам нужно собрать в war-файл, используя только возможности командной строки. Вообще говоря, вариантов структурной организации таких исходников множество, но здесь мы предположим наиболее часто встречающийся вариант - проект для Liferay Plugins SDK. В реальной жизни практически любые исходники плагина для Liferay можно преобразовать в такой проект, так что все остальные ситуации после более или менее продолжительного шаманства можно свести к описываемой здесь.
Тех. процесс
Для начала установим Ant и Liferay Plugins SDK. Первый ставится стандартным образом:
jek@jek-laptop:~$ sudo apt-get install ant
SDK достаточно просто скачать отсюда и распаковать в удобный нам для сборки каталог. Теперь, для того, чтобы всё собиралось, нужно установить Liferay нужной нам версии. Простейший вариант - скачать бандл на базе Apache Tomcat и распаковать его в тот же самый "сборочный" каталог. После того, как портал скачан и установлен, надо поправить конфигурационные файлы SDK:
jek@jek-laptop:~/work/liferay-plugins-sdk-6.1.1$ cat build.properties
app.server.portal.dir = /home/jek/work/liferay-portal-6.1.1-ce-ga2/tomcat-7.0.27/webapps/ROOT
app.server.lib.global.dir = /home/jek/work/liferay-portal-6.1.1-ce-ga2/tomcat-7.0.27/lib/ext
app.server.deploy.dir = /home/jek/work/liferay-portal-6.1.1-ce-ga2/tomcat-7.0.27/webapps
app.server.type = tomcat
app.server.dir = /home/jek/work/liferay-portal-6.1.1-ce-ga2/tomcat-7.0.27/
javac.encoding=UTF-8
По идее, это должно быть всё :)
Сборка плагина и сопутствующее шаманство
Теперь помещаем наш плагин в соответствующий его сути каталог SDK. Если это портлет, то кладём его в каталог portlets, если хук - то hooks и т.д. Пробуем собрать:
jek@jek-laptop:~/work/liferay-plugins-sdk-6.1.1/portlets/my-sample-portlet$ ant war
Buildfile: /home/jek/work/liferay-plugins-sdk-6.1.1/portlets/my-sample-portlet/build.xml
[copy] Copying 1 file to /usr/share/ant/lib
BUILD FAILED
/home/jek/work/liferay-plugins-sdk-6.1.1/portlets/my-sample-portlet/build.xml:5: The following error occurred while executing this line:
/home/jek/work/liferay-plugins-sdk-6.1.1/portlets/build-common-portlet.xml:7: The following error occurred while executing this line:
/home/jek/work/liferay-plugins-sdk-6.1.1/build-common-plugin.xml:5: The following error occurred while executing this line:
/home/jek/work/liferay-plugins-sdk-6.1.1/build-common.xml:68: Failed to copy /home/jek/work/liferay-plugins-sdk-6.1.1/lib/ecj.jar to /usr/share/ant/lib/ecj.jar due to java.io.FileNotFoundException /usr/share/ant/lib/ecj.jar (Отказано в доступе)
Total time: 1 second
Ужос, всё упало! Ничего страшного, ставим компилятор ECJ:
jek@jek-laptop:~/work/liferay-plugins-sdk-6.1.1/portlets/my-sample-portlet$ sudo apt-get install ecj
Проверяем наличие файла в библиотеках Ant'а:
jek@jek-laptop:~/work/liferay-plugins-sdk-6.1.1/portlets/my-sample-portlet$ ls /usr/share/ant/lib/
ant-antlr.jar ant-apache-xalan2.jar ant-jsch.jar
ant-apache-bcel.jar ant-commons-logging.jar ant-junit4.jar
ant-apache-bsf.jar ant-commons-net.jar ant-junit.jar
ant-apache-log4j.jar ant.jar ant-launcher.jar
ant-apache-oro.jar ant-javamail.jar ant-swing.jar
ant-apache-regexp.jar ant-jdepend.jar ant-testutil.jar
ant-apache-resolver.jar ant-jmf.jar junit.jar
Его там нет. К счастью, у нас есть гугл, который находит вот такой совет. Следуем предложенной рекомендации и пробуем пересобрать плагин:
jek@jek-laptop:~/work/liferay-plugins-sdk-6.1.1/portlets/my-sample-portlet$ sudo ln -s /usr/share/java/ecj.jar /usr/share/ant/lib/ecj.jar
jek@jek-laptop:~/work/liferay-plugins-sdk-6.1.1/portlets/my-sample-portlet$ ant war
Buildfile: /home/jek/work/liferay-plugins-sdk-6.1.1/portlets/my-sample-portlet/build.xml
compile:
(...)
clean-portal-dependencies:
[zip] Building zip: /home/jek/work/liferay-plugins-sdk-6.1.1/dist/my-sample-portlet-6.1.1.1.war
BUILD SUCCESSFUL
Total time: 34 seconds
Ура! Всё заработало!