Mavenizar Liferay SDK.
0. Índice de
contenidos.
1. Introducción
El desarrollo
con el plugin SDK de Liferay está muy bien
pero le falta algo fundamental: no tiene soporte de Maven. El soporte
de Maven nos permite hacer de forma sencilla el sitio web del proyecto
con informes muy útiles como: javadoc, cobertura, PMD y
muchos otros informes. Además nos permite integrar de una forma muy cómoda nuestro proyecto con una aplicación de integración continua como Hudson y hacer un seguimiento de la calidad del código con Sonar.
En esta misma web tienes varios tutoriales
que hablan de esta estupenda tecnología. En vez de renunciar
a estas ventajas lo que podemos hacer es adaptar la creación
de un proyecto con el SDK a un proyecto de Maven utilizando Eclipse.
2. Entorno
El tutorial está
escrito usando el siguiente entorno:
- Hardware:
Portátil Asus G50Vseries (Core Duo P8600 2.4GHz, 4GB RAM,
320 GB HD). - Sistema operativo: Ubuntu
9.04 Desktop - Mozilla Firefox 2.0.0.20
- Maven 2.2.20
- Liferay 5.2.3 (Portal + Plugins SDK)
3. ¿Cómo
hacer la adaptación?
El primer paso
es crear un plugin de tipo portlet de la forma que se ha visto en este tutorial: https://adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=LiferayPluginsSDK y y que vamos a usar de referencia
para crear el proyecto de Maven, a partir de ahora nos referiremos como
REF_PORTLET. Para ello abrimos un terminal, nos situamos en la ruta
SDK_LIFERAY/portlets y escribimos lo siguiente:
./create.sh ref “RefPortlet”
Luego tenemos que crear un proyecto Maven de tipo web, al que nos
referiremos como MAVEN_PORTLET. Para ello abrimos un terminal, nos
situamos en el directorio donde vayamos a crear el proyecto y ponemos
lo siguiente:
mvn archetype:create -DgroupId=com.autentia.training -DartifactId=maven-portlet -DarchetypeArtifactId=maven-archetype-webapp
Para poder convertir este proyecto en un proyecto de portlet Liferay
tenemos que copiar algunos archivos del proyecto de referencia a este
proyecto Maven.
En primer lugar copiamos todo el contenido del directorio
REF_PORTLET/docroot dentro de la carpeta
MAVEN_PORTLET/src/main/webapp, sobreescribiendo todo el contenido y
borramos el directorio MAVEN_PORTLET/src/main/webapp/WEB-INF/src.
El siguiente paso es importar el proyecto en Eclipse. Para ello dentro
de Eclipse vamos a File → Import → Maven 2 Project.
En la siguiente pantalla pulsamos sobre el botón
“Browser”, seleccionando el directorio
MAVEN_PORTLET, marcamos el fichero pom.xml que detectará
el asistente y pulsamos en “Finish”.
Ahora tenemos que relacionar el proyecto con el servidor que contiene
Liferay. Para ello pulsamos con el botón derecho sobre la
raíz del proyecto y seleccionamos la opción
“Properties” → “Targeted
Runtimes”, seleccionamos el servidor de Liferay y
pulsamos sobre “OK”. De este modo ya tienen que
solucionar los problemas de compilación del proyecto y
podremos hacer uso de las librerías que proporciona Liferay
en tiempo de compilación ya que en ejecución
estas librerías ya existen.
De esta forma ya estamos en disposición de crear nuestro
primer portlet. Para ello creamos una clase dentro de la carpeta
src/main/java que extienda de la clase GenericPortlet como en el
siguiente código:
package com.autentia.training; import java.io.IOException; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; import javax.portlet.GenericPortlet; import javax.portlet.PortletException; import javax.portlet.PortletRequestDispatcher; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; public class MavenPortlet extends GenericPortlet { public void init() throws PortletException { editJSP = getInitParameter("edit-jsp"); helpJSP = getInitParameter("help-jsp"); viewJSP = getInitParameter("view-jsp"); } public void doDispatch(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException { String jspPage = renderRequest.getParameter("jspPage"); if(jspPage != null) { include(jspPage, renderRequest,renderResponse); }else{ super.doDispatch(renderRequest,renderResponse); } } public void doEdit(RenderRequest renderRequest,RenderResponse renderResponse) throws IOException, PortletException { if(renderRequest.getPreferences() == null) { super.doEdit(renderRequest,renderResponse); }else{ include(editJSP, renderRequest,renderResponse); } } public void doHelp(RenderRequest renderRequest,RenderResponse renderResponse) throws IOException, PortletException { include(helpJSP, renderRequest, renderResponse); } public void doView(RenderRequest renderRequest,RenderResponse renderResponse) throws IOException, PortletException { include(viewJSP, renderRequest, renderResponse); } public void processAction(ActionRequest actionRequest,ActionResponse actionResponse) throws IOException, PortletException { } protected void include(String path, RenderRequest renderRequest,RenderResponse renderResponse) throws IOException, PortletException { PortletRequestDispatcher portletRequestDispatcher = getPortletContext().getRequestDispatcher(path); if (portletRequestDispatcher == null) { _log.error(path + " is not a valid include"); }else{ portletRequestDispatcher.include(renderRequest,renderResponse); } } protected String editJSP; protected String helpJSP; protected String viewJSP; private static Log _log = LogFactoryUtil.getLog(MavenPortlet.class); }
Ahora tenemos que editar el fichero de configuración
portlet.xml que se encuentra en la carpeta WEB-INF del proyecto. En
este fichero vamos a modificar el nombre del portlet, el nombre de
visualización y sobre todo la clase. Opcionalmente
también podemos modificar la información y los
roles. El fichero debería presentar este aspecto:
maven Maven Portlet com.autentia.training.MavenPortlet view-jsp /view.jsp 0 text/html Maven Portlet Maven Portlet Maven Portlet administrator guest power-user user
Una vez que hemos establecido el portlet-name, pasamos a editar el
fichero liferay-display.xml donde tenemos que establecer el nombre de
la categoría y el id del portlet, que se corresponde con el
portlet-name. El fichero debe presentar el siguiente aspecto:
Es la hora de probar el portlet y desplegarlo en el servidor, para ello
vamos a configurar en el fichero pom.xml del proyecto una tarea ant que
permita que el .war generado en la fase de package se copie en la
carpeta deploy del servidor Liferay. Para conseguir esto editamos el
fichero pom.xml del proyecto y lo dejamos con el siguiente aspecto:
4.0.0 com.autentia.training maven-portlet war 1.0-SNAPSHOT maven-portlet Maven Webapp http://maven.apache.org {ruta de la carpeta deploy} {ruta carpeta webapps del servidor} junit junit 3.8.1 test com.liferay portlet 1.0 provided com.liferay portal-kernel 1.0 provided maven-portlet maven-antrun-plugin package run Borrando a ${portlet-deploy}/maven-portlet Copiando a ${portlet-hotdeploy}
Lamentablemente a día de hoy no tenemos las librerías de Liferay en ningún repositorio oficial por lo que tendremos que instalar a mano, como mínimo para este ejemplo, las dependencias portlet y portal-kernel cuyos .jar se encuentran en en el directorio LIFERAY_TOMCAT_HOME/libs/ext.
Para hacer esto debemos ejecutar lo siguiente en un terminal del sistema para cada una de las librerías:
mvn install:install-file -Dfile=ruta_absoluta_jar -DgroupId=com.liferay -DartifactId=portal-kernel o portlet -Dversion=1.0 -Dpackaging=jar
Con esta configuración estamos consiguiendo que cuando
ejecutemos mvn package del proyecto, esto genere un archivo .war y haga
un deploy limpio en el servidor que le indiquemos en las propiedades.
Para probar el despliegue podemos editar el fichero view.jsp
añadiendo un mensaje del tipo: ¡Este portlet esta
hecho con Maven!.
Una vez realizado el cambio, guardamos y ejecutamos en un terminal dentro del directorio raíz del proyecto:
mvn package
Si el servidor Liferay ya esta arrancado veremos en las trazas de log que se produce el despliegue en caliente, sino después de ejecutar el comando, arrancamos el servidor.
Y este tiene que ser el resultado final del portlet:
4.
Conclusiones.
Cómo veis no tenemos porque renunciar a todas las ventajas que nos ofrece la forma de trabajo con Maven sólo porque tengamos que desarrollar portlets en Liferay. Sólo hay que echarle un poco de inventiva y adaptar una cosa con la otra.
Saludos.