my.life.logging.Blog

Создание портлета для Liferay с помощью Wicket. Часть 1. Портлетный проект для Liferay портала

Данное руководство детально описывает процесс создания портлета для Liferay портала cредствами фреймворка Wicket.

Все части руководства:

  1. Портлетный проект для Liferay портала
  2. Конфигурация Wicket-портлета, или web.xml, portlet.xml и т.д., и т.п.
  3. Разработка функциональности Wicket-портлета
  4. Если используется Spring Framework

Исходный код разрабатываемого примера доступен на GitHub.


Приветствую тебя, уважаемый пользователь фреймворка Wicket!

Насколько я понимаю, у тебя возникла насущная необходимость разработать один-два непритязательных портлета для Liferay портала, и именно поэтому ты решил почитать это руководство? Если так, то я постараюсь показать тебе в деталях, каким образом можно создать небольшой портлет с помощью Wicket.

Если же я не угадал и насущной потребности реализовывать портлеты у тебя нет, то я нахожу не очень логичным для тебя продолжать чтение. Ведь статья более, чем полностью, состоит из технических подробностей. Так что она вряд ли в какой-либо мере будет способствовать развитию твоего внутреннего мира и, скорее всего, ровным счетом никак не поможет тебе победить Толика Вассермана в “Своей игре”. Как минимум, мне кажется, тебе будет не очень интересно. Но если ты все-таки решил, что тебе просто обязательно знать, каким образом можно написать на Wicket свой собственный портлет с AJAX’ом и “глюками”, то хорошо, читай.

Сразу хочу предупредить, что Wicket - далеко не самый лучший выбор среди фреймворков для создания портлетов. Разработчики Wicket сами портлеты не используют, поэтому не стоит ожидать от Wicket богатых инструментов для быстрой и удобной реализации всех возможностей, описанных в портлетной спецификации. Чего стоит ожидать, так это некоторого количества недокументированных “ловушек”, и на изменение в ближайшее время этой ситуации вряд ли стоит рассчитывать. Но, несмотря на все преграды, создание полнофункционального портлета на базе Wicket вполне возможно. Так что если ты много дней и ночей посвятил разработке Wicket’овских Panel’ей, Page’й и других Component’ов, то можешь продолжать в том же духе и при разработке для Liferay. Чем больше сложностей, тем ценнее, надеюсь, будет для тебя это руководство.

Имей также ввиду, что дальше речь пойдет о следующих версиях инструментов и спецификаций:

  • Портлетная спецификация JSR-286.
  • Фреймворк Apache Wicket 1.4.x.

Дело в том, что в Wicket 1.4.x в отличие от 1.5.x классы для создания портлетов находятся еще в ядре фреймворка. В Wicket 1.5.x они вынесены в отдельный проект - wicketstuff-portlet-1.5.x.jar. Так что можно разрабатывать портлеты и с помощью Wicket 1.5.x, но при этом придется иметь в CLASSPATH еще парочку дополнительных JAR-ников.

  • Портал Liferay 6.0.6.

Думаю, этим руководством можно пользоваться и при разработке портлетов для Liferay версии 6.1.0. Однако нужно иметь ввиду, что на момент написания этого руководства Wicket-портлеты не работали на Liferay 6.1.0 в связи с ошибкой: java.lang.IllegalArgumentException: Error initializing WicketFilter - you have no element with a url-pattern that uses filter: AchievementPortlet Чтобы устранить данную проблему можно попробовать использовать подход, предложенный вот здесь. Суть его состоит в том, что нужно просто добавить строчку liferay-web-xml-enabled=false в файл liferay-plugin-package.properties. Это отключит добрую пачку web-фильтров, используемых Liferay для внутренних нужд, но мы ведь все равно в них не нуждались, не правда ли? Так или иначе, опция отключает лишь автоматическое создание фильтров, и всегда можно мануально добавить их в файл liferay-web.xml, как только они потребуются! Но это уже совсем другая история…

И еще, the last but not least: создавать портлет я буду в среде разработки Eclipse (а именно - в сборке Eclipse IDE for Java EE Developers). Просто потому, что сам работаю с этой средой и нахожу ее вполне удобной для разработки портлетов. Так что очень надеюсь, что ты обладаешь знаниями, откуда можно скачать (например, ты знаешь про эту страницу: http://www.eclipse.org/downloads) и каким образом установить Eclipse. Насколько данное руководство будет полезно пользователям других IDE, я судить не берусь.

Что же все-таки разрабатываем?

Как, надеюсь, уже стало понятно, создание портлета для Liferay с помощью Wicket будет довольно непростой задачей. А выполнение любой непростой задачи можно считать в некотором роде достижением. Это и будет темой нашего портлета: он будет отображать в виде текста на странице информацию о некотором достижении (achievement). Информация о достижении будет заполняться в режиме редактирования портлета тем человеком, который добавит портлет на страницу, и в дальнейшем будет напоминать ему о его успехе.

Готовимся к разработке

Для начала разработки нам потребуется иметь установленными и настроенными следующие вещи:

1. Liferay Portal Community Edition. Скачать такую версию портала можно с официального сайта Liferay по ссылке http://www.liferay.com/downloads/liferay-portal/available-releases. Лично для себя я выбрал Liferay в комплекте с Tomcat (“Bundled with Tomcat”), соответственно про него дальше и пойдет речь.

Распакуем содержимое архива, например, в папку /home/user/liferay/liferay-portal-6.0.6 (в дальнейшем - LIFERAY_HOME). Тогда путь до портального сервера будет чем-то вроде /home/user/liferay/liferay-portal-6.0.6/tomcat-6.0.29 (в дальнейшем - LIFERAY_TOMCAT_HOME).

2. Liferay Plugins SDK. Скачать его также можно с официального сайта Liferay по ссылке http://www.liferay.com/downloads/liferay-portal/additional-files. Ссылка на скачивание именно SDK должна быть где-то внизу страницы.

Распакуем содержимое архива, например, в папку /home/user/liferay/liferay-plugins-sdk-6.0.6 (в дальнейшем - LIFERAY_SDK_HOME).

3. Не обязательным, но желательным пунктом является Liferay IDE - плагин для Eclipse. Найти его можно, например, в Eclipse Marketplace. Данный плагин поможет сократить время при выполнении рутинных операций.

4. И если случилось такое, что у тебя имеется какая-то экзотическая версия Eclipse без встроенного в нее Apache Ant или ты собираешься собирать портлеты из командной строки, то понадобится иметь установленным Apache Ant. Скачать можно здесь: http://ant.apache.org/bindownload.cgi.

Установить Ant можно воспользовавшись официальным руководством по адресу http://ant.apache.org/manual/index.html (в меню справа надо выбрать пункт “Installing Ant”) или, если тебя пугает большое количество английский букв, просто введи в поисковой строке Google “Установка Ant” и нажми на кнопку “Мне повезёт!”. Как же все-таки хорошо, когда нам хоть в чем-то везет!

Настраиваем среду разработки

Ну, так что, признавайся, установил ты Liferay IDE for Eclipse? Поставил? Молодец! Я думаю, ты сможешь и это достижение отразить в качестве портлета после того, как мы его разработаем.

Но всему свое время, а пока обрати внимание на панель с тремя синими кнопочками, которая появилась в Eclipse после установки плагина:

Вначале сообщим LIferay IDE, где находится Plugins SDK:

  • Вызываем контекстное меню для третьей из кнопок на панели, выбираем в нем пункт “New Liferay SDK”.
  • Вводим в появившемся диалоговом окне в поле “Location” путь до директории, в которой раположен SDK. В нашем случае это значение LIFERAY_SDK_HOME.
  • Закрываем диалог свойств “Prerefences” нажатием на кнопку “OK”.

Также добавляем сервер для запуска Liferay из Eclipse:

  • В контекстном меню для третьей из кнопок выбираем пункт “New Liferay Server”.
  • В появившемся окне выбираем тип сервера, который используется для запуска Liferay. В нашем случае это “Liferay v6.0 CE Server (Tomcat 6)”. Нажимаем кнопку “Next”.
  • В поле “Liferay Tomcat directory” вводим путь до сервера Tomcat, используемого для запуска Liferay, то есть в нашем случае значение LIFERAY_TOMCAT_HOME.
  • Нажимаем кнопку “Finish”.

Как быть, если нет возможности установить плагин? Возможно, у тебя в офисе проблемы с Интернетом, или ты просто терпеть не можешь устанавливать плагины? Не беда! Просто нужно сделать следующее:

  • Создать в директории LIFERAY_SDK_HOME файл build.user.properties, где user – имя твоего пользователя ОС, с единственной строчкой:
1
app.server.dir=${LIFERAY_TOMCAT_HOME}

Разумеется, вместо ${LIFERAY_TOMCAT_HOME} нужно написать значение LIFERAY_TOMCAT_HOME, то есть путь до директории сервера Tomcat, используемого для запуска Liferay.

  • Добавить сервер из LIFERAY_TOMCAT_HOME как обычный Tomcat-сервер в Eclipse.
  • После того, как сервер появится на вкладке “Servers”, выбрать в контекстном меню для этого сервера пункт “Open”.
  • В открывшемся окне настроек сервера нужно изменить следующее:
    • В разделе “Server Locations” выбрать “Use Tomcat installation”.
    • В поле “Deploy path” чуть ниже указать путь до папки ${LIFERAY_TOMCAT_HOME}/webapps.
    • В разделе “Publishing” выбрать “Never publish automatically”.
    • В разделе “Timeouts” для обоих таймаутов (“Start (in seconds)” и “Stop (in seconds)”) указать значение 300 секунд.
    • Нажать на ссылку “Open launch configuration”, и в открывшемся окне на вкладке “Arguments” указать следующие дополнительные агрументы для запуска JVM:
1
-Dfile.encoding=UTF8 -Duser.timezone=GMT -XX:MaxPermSize=256m -Xmx1024m -Dexternal-properties=portal-developer.properties

Дело в шляпе. Теперь ты тоже можешь запускать и останавливать Liferay.

Настройка среды разработки в том случае, если используется не-Tomcat’овская сборка Liferay портала, не будет настолько же простой, как описано выше - как с использованием плагина Liferay IDE for Eclipse, так и без него. Кроме того, использование какого-либо сервера, помимо Tomcat, при разработке для Liferay чревато некоторыми ограничениями (например, потерей возможности отлаживать портлеты). Некоторые советы по организации разработки с использованием не-Tomcat’овской сборки Liferay описаны, например, вот здесь.

Итак, время пришло - создадим же наш портлетный проект.

Создаем портлет с помощью Liferay IDE for Eclipse

Тут все просто.

  • Нажимаем на первую кнопку на панели Liferay IDE “Create a new Liferay Plugin Project”.
  • В появившемся окне:
    • Вводим “achievement” в поле “Project name”.
    • Вводим “Achievement” в поле “Display name”.
    • В качестве типа проекта (поле “Plugin Type”) выбираем “Portlet”.

В итоге окно создания портлетного проекта будет выглядеть как-то вот так:

  • После нажатия на кнопку “Finish” наш проект будет создан.

Создаем портлет без помощи Liferay IDE for Eclipse

Тут все немного сложнее. Однако ж, иногда требуется создать портлет именно таким образом, например, если нужно хранить свой проект где-нибудь, помимо одной из папок Liferay Plugins SDK (чего плагин Liferay IDE требует в обязательном порядке). Выполнение следующего алгоритма приведет нас к заданной цели:

  • Переходим в ${LIFERAY_SDK_HOME}/portlets и создаем проект с помощью команды
1
./create.sh achievement "Achievement"

или команды

1
create.bat achievement "Achievement"

в зависимости от того, какая из команд сработает на твоей операционной системе.

  • Добавляем проект в Eclipse без помощи плагина “Liferay IDE for Eclipse”. Для этого:
    • Выбираем в меню “File” > “New” > “Dynamic Web Project”. В качестве имени проекта (“Project name”) вводим achievement-portlet, снимаем галочку “Use default location”.
    • Указываем местонахождение проекта в поле “Location”.
    • Указываем целевой сервер (“Target runtime”) и версию web-модуля (“Dynamic web module version”) для нашего проекта, нажимаем “Next”.
    • На следующей вкладке удаляем старую директорию исходников в поле “Source folders on build path” и добавляем туда docroot/WEB-INF/src. В поле “Default output folder” вводим docroot/WEB-INF/classes. Нажимаем “Next”.
    • На следующей вкладке в поле “Content Directory” печатаем docroot. Снимаем галочку “Generate web.xml deployment descriptor”.
    • Нажимаем “Finish”.
  • Чтобы не было ошибок компиляции, в свойствах проекта на вкладке “Java Build Path” –> “Libraries” должны быть указаны следующие библиотеки:
    • Библиотеки Tomcat, использующегося для запуска Liferay (расположенного по пути LIFERAY_TOMCAT_HOME).
    • Следующие библиотеки, расположенные по пути ${LIFERAY_TOMCAT_HOME}/webapps/ROOT/WEB-INF/lib:
      • commons-logging.jar
      • util-java.jar
      • util-taglib.jar
      • util-bridges.jar

В итоге получаем

В итоге наш проект achievement-portlet будет иметь следующую структуру:

Ошибки в данном случае связаны с тем, что Eclipse не смог распарсить структуру JSP-файла. Ничего страшного в этом нет, тем более, что этот JSP-файл нам все равно не понадобится.

Установить портлет на Liferay можно с помощью Ant-таска “deploy”. После запуска сервера Liferay изнутри Eclipse, портлет можно будет добавить на страницу портала, и он будет иметь следующий вид:

Для полного счастья добавляем в папку lib проекта несколько JAR-файлов:

  • wicket-1.4.x.jar
  • wicket-extensions-1.4.x.jar
  • slf4j-api-1.y.z.jar
  • slf4j-log4j12-1.y.z.jar

Вместо x, y и z подставьте номера тех версий библиотек, которые вам более всего придутся по душе. Библиотека wicket-extensions-1.4.x.jar нужна нам из-за некоторой содержащейся в ней AJAX-функциональности.

Все, теперь можно и разработку начать.

Comments