Crear proyectos, módulos y portlets de Liferay 7 con Blade CLI

En este tutorial se explica cómo crear proyectos, módulos y portlets para Liferay Portal 7 CE con Blade CLI para que utilicemos nuestro IDE favorito, sin depender de Liferay IDE.

Índice de contenidos

1. Introducción

Cuando leemos la documentación de Liferay, vemos que nos recomiendan emplear Liferay IDE para desarrollar. Este IDE es una extensión de Eclipse con plugins de Liferay Portal integrados, así que, si tu IDE favorito es Eclipse, sin duda es la mejor opción para ti. En mi caso, no me sentiría nada cómodo si tuviera que dejar de utilizar IntelliJ y, por tanto, no poder aprovechar sus cualidades. ¿Nos quedamos entonces sin las facilidades que proporciona Liferay IDE? Afortunadamente, no. Los de Liferay saben que cada uno programa con su IDE favorito y no quieren forzar a nadie a cambiar a Eclipse, así que han construido herramientas independientes del IDE que nos facilitan nuestra labor. Una de ellas es Blade CLI, y es la que emplearemos a lo largo de este tutorial para crear nuestro proyecto, nuestros módulos, desplegar nuestros portlets y arrancar nuestro servidor de Liferay local.

Durante el tutorial veremos que toda la estructura y código se genera automáticamente con Blade CLI, así que, mientras utilicemos la misma versión de esta herramienta, generaremos el mismo código. No obstante, lo he subido a GitHub por si a alguien le surge algún problema, para que pueda comparar.

2. Entorno

Este tutorial se ha desarrollado en el siguiente entorno:

  • Portátil MacBook Pro (Retina, 15′, mediados 2015), macOS Sierra 10.12.4
  • Liferay Community Edition Portal 7.0.2 GA3 (Wilberforce / Build 7002 / August 5, 2016)
  • Java 1.8.0_131
  • IntelliJ IDEA Ultimate 2017.1.2
  • NetBeans 8.2
  • Eclipse Neon 4.6.3

3. Instalar Blade CLI

Blade CLI es una herramienta que facilita la labor de los desarrolladores de Liferay. La documentación oficial nos dice que Liferay IDE emplea Blade CLI por debajo, así que, para lo que pretendemos conseguir en este tutorial, nos basta Blade CLI para conseguir las ventajas que Liferay IDE nos daría.

Primero vamos a instalar Java Package Manager (JPM) para instalar con él Blade CLI. Si estamos en macOS o Linux, podemos abrir una terminal y ejecutar:

Comprobamos que se ha instalado correctamente ejecutando los comandos jpm y blade.

Podemos ver la versión de Blade CLI con blade version. Para actualizarlo:

4. Crear un proyecto Liferay con Blade CLI

Una vez instalado Blade CLI, lo usaremos para crear nuestro proyecto Liferay. Para ello, primero nos desplazamos por terminal al directorio donde queremos crearlo. Ahí ejecutamos el siguiente comando:

Por ejemplo, si en el directorio workspaces ejecutamos blade init tutorial-liferay-blade, entonces se creará la carpeta workspaces/tutorial-liferay-blade, que será nuestro proyecto Gradle de Liferay:

De manera alternativa, podemos crear primero el directorio workspaces/tutorial-liferay-blade, entrar a él por terminal y entonces ejecutar blade init.

Una vez generado el proyecto, crearemos un portlet de ejemplo y lo desplegaremos en un servidor local, pero antes tenemos que instalar dicho servidor.

5. Levantar el servidor local

El portlet que generemos más adelante lo desplegaremos en una instancia local de Liferay Portal. Ésta será la que Liferay nos proporciona en su paquete de Liferay Portal + Tomcat (ver el tutorial Introducción a Liferay Portal 7 CE de César). Sin embargo, en lugar de descargarlo manualmente, vamos a dejar que Blade lo haga por nosotros.

Liferay recomienda que el paquete de Liferay Portal + Tomcat lo tengamos en una carpeta bundles en la raíz del proyecto que acabamos de crear pero, si no queremos que se encuentre ahí, entonces podremos indicarle la ruta en la que queremos que esté a través de la propiedad liferay.workspace.home.dir del archivo gradle.properties —que por defecto tomará el valor bundles si la dejamos comentada—. Por ejemplo:

Sea cual sea nuestra elección, ejecutaremos el siguiente comando desde la raíz del proyecto para que descargue y descomprima el paquete de Liferay Portal + Tomcat:

La versión del paquete que descarga la podemos redefinir a través de la propiedad liferay.workspace.bundle.url del archivo gradle.properties. También es interesante saber que, al menos en macOS, el ZIP que descarga lo almacena en el directorio $HOME/.liferay/bundles (ejemplo: /Users/jsanchez/.liferay/bundles), por si acaso lo tenemos que borrar si hemos interrumpido la descarga y nos da error al volver a ejecutar ./gradlew initBundle, o por si ya lo habíamos descargado manualmente, para ponerlo en ese directorio y que así no lo vuelva a descargar.

Una vez descargado el servidor, procedemos a arrancarlo. Esto podemos hacerlo de diferentes maneras:

  • Si el paquete de Liferay Portal + Tomcat lo tenemos en la carpeta bundles de nuestro proyecto, sirviéndonos de Blade CLI. Para ello, desde la raíz de nuestro proyecto, ejecutamos blade server start -b. La opción -b sirve para ejecutar este proceso en segundo plano; sin ella, la terminal nos iría mostrando los logs del proceso de arranque.
  • En cualquier caso, accediendo al directorio tomcat-8.0.32/bin (ejemplo: /Users/jsanchez/Liferay/liferay-ce-portal-7.0-ga3/tomcat-8.0.32/bin) y ejecutando ./startup.sh.

Recordad que el despliegue se toma su tiempo. Con blade server start (sin -b) podemos ir viendo el proceso de arranque, ya que vemos el volcado de los logs en terminal. Sabremos que ha concluido cuando veamos la siguiente traza de log:

En este punto ya podemos abrir http://localhost:8080/ en nuestro navegador para ver el asistente de Liferay Portal si lo hemos ejecutado por primera vez y configurarlo a nuestro gusto (es recomendable sustituir Hypersonic por una base de datos robusta).

Para parar el servidor, ejecutamos:

  • blade server stop desde la raíz de nuestro proyecto si el Tomcat lo tenemos en la carpeta bundles de nuestro proyecto.
  • ./shutdown.sh desde el directorio tomcat-8.0.32/bin, se encuentre donde se encuentre éste.
  • O bien hacemos ctrl + C en la terminal en la que arrancamos el servidor si lo hicimos sin la opción -b.

6. Añadir un módulo con un portlet al proyecto

Llegados a este punto, nuestro interés es crear portlets. Vamos a crear en nuestro proyecto un módulo que contenga el portlet de ejemplo. ¿Cómo lo creamos?, ¿con qué estructura? Blade CLI responderá a nuestras preguntas, pues va a ser él quien nos cree el módulo y el portlet, ya que nos ofrece la posibilidad de crear plantillas para empezar a desarrollar a partir de ellas. Para crear un módulo con un portlet MVC de Liferay, ejecutamos desde la carpeta modules el siguiente comando:

Por ejemplo:

Esto nos creará el módulo mymodule dentro de la carpeta modules. El módulo contendrá una carpeta src con el código del portlet, un archivo bnd.bnd y el build.gradle con las dependencias necesarias. Yo recomiendo no actualizar la versión de las dependencias para evitar conflictos con las mismas; ya se encarga la gente de Liferay de actualizar Blade CLI para autogenerar el build.gradle adecuado.

Por último, quiero indicar que mvc-portlet no es la única plantilla que nos proporciona Blade CLI. Con blade create -l podemos obtener una lista de todas las que ofrece.

7. Desplegar el portlet en Liferay Portal

Tenemos un portlet de ejemplo que, aunque simplemente muestra un texto, nos gustaría ver en acción. Para ello, empezamos creando el JAR del módulo del portlet con el siguiente comando, ejecutado desde la carpeta del módulo (desde /tutorial-liferay-blade/modules/mymodule):

De manera alternativa, podemos utilizar ./gradlew jar, ya que cuando a Blade le damos el comando gw <nombre_tarea>, lo que hace es ejecutar la tarea de Gradle indicada, empleando para ello el Gradle Wrapper. Por cierto, ./gradlew jar deberá ser lanzado desde la raíz del proyecto, ya que es ahí donde se encuentra el archivo gradlew.

Tras su ejecución, se habrá generado una carpeta build en la carpeta de nuestro módulo, y ésta contendrá otra llamada libs en donde se encontrará el JAR generado. Este JAR lo tendremos que desplegar en nuestro servidor local. Hasta que no lo hagamos, no podremos utilizarlo; comprobémoslo: accedemos a Liferay Portal, pulsamos sobre el botón + arriba a la derecha, buscamos nuestro módulo y vemos que no lo encuentra.

Para desplegarlo, nos aseguramos de que tenemos el servidor levantado y, entonces, nos vamos desde terminal al directorio del módulo y ejecutamos el siguiente comando:

Si tuviésemos diferentes módulos y quisiésemos desplegarlos todos a la vez, entonces podríamos ejecutar el anterior comando desde el directorio modules o desde la raíz de nuestro proyecto.

De manera alternativa, podemos utilizar gradle deploy desde el directorio del módulo para desplegar.

Si teníamos el servidor levantado, basta con recargar la página para poder añadir el portlet:

8. Abrir nuestro proyecto con un IDE

De momento, hemos usado únicamente Blade CLI para crear desde cero un proyecto y un módulo, para arrancar el servidor local y para desplegar en él el portlet de ejemplo. Ahora queremos modificar un poco el portlet y, por tanto, emplear un IDE para ello. Vamos a ver rápidamente cómo hacerlo en diferentes IDE.

8.1. IntelliJ IDEA

Ejecutamos IntelliJ y elegimos abrir un proyecto. Seleccionamos la carpeta de nuestro proyecto Liferay y, en la siguiente ventana, pulsamos OK:

Se nos abrirá una ventanita para elegir los módulos Gradle. Incluimos todos:

Al hacerlo, deberíamos tener añadidas automáticamente las bibliotecas que vimos que nuestro build.gradle incluye:

Además, si abrimos el panel Gradle, podremos ejecutar directamente desde ahí las tareas de construcción y despliegue que vimos en la sección 7. Desplegar el portlet en Liferay Portal, sin necesidad de utilizar la consola.

8.2. NetBeans

NetBeans no nos lo pone tan fácil como IntelliJ pues, si intentamos abrir un proyecto, no nos dejará seleccionar el proyecto Gradle que hemos creado. Debemos instalar antes el plugin Gradle Support. Para ello, iniciamos NetBeans y abrimos Tools / Plugins, buscamos el plugin Gradle Support y lo instalamos.

Reiniciamos NetBeans y ya, al elegir File/Open Project…, podremos abrir nuestro proyecto (de hecho, veremos el icono de Gradle como icono de carpeta).

En la vista de proyecto, veremos tanto el proyecto tutorial-liferay-blade, como el módulo mymodule.

Hacemos doble clic en mymodule y se nos abrirá ya el módulo que contiene nuestro portlet.

8.3. Eclipse

Si nuestro interés es desarrollar con Eclipse, entonces mejor hacerlo con Liferay IDE, pues es una extensión de Eclipse con plugins de Liferay Portal integrados. No obstante, vamos a describir aquí cómo abrir nuestro proyecto con un Eclipse limpio, al igual que hicimos con IntelliJ y NetBeans.

Primero abrimos el proyecto haciendo clic en File / Open Projects from File System….

Vemos que los archivos .gradle no los reconoce, así que procedemos a instalar un plugin para dar soporte a Gradle. Vamos a Help / Eclipse Marketplace…, instalamos el plugin Buildship Gradle Integration 2.0 y reiniciamos Eclipse.

Ahora hacemos clic derecho en el proyecto y elegimos Configure / Add Gradle Nature.

Vemos que nos ha separado el proyecto en tres: modules —que está vacío—, mymodule y tutorial-liferay-blade, y que ya reconoce los archivos .gradle.

Si hacemos clic derecho en tutorial-liferay-blade y elegimos Validate, veremos que obtenemos miles de errores y warnings. Todos ellos surgen de la carpeta bundles, aquella en la que metimos nuestro paquete de Liferay Portal + Tomcat, así que vamos a excluirla de la validación. Para ello, hacemos clic derecho en ella, pinchamos en Properties y, en el panel Resource, marcamos el atributo Derived.

Si validamos mymodule, nos da error el archivo view.jsp. Simplemente hace falta cambiar <%@ include file="/init.jsp" %> por <%@ include file="./init.jsp" %>.

9. Conclusiones

Si ante la recomendación de Liferay de emplear Liferay IDE se nos cayó el alma a los pies al ver que era Eclipse, estamos de enhorabuena. Con Blade CLI podemos obtener los beneficios de dicho IDE para la creación de proyectos Liferay pero sin vernos atados a él, pudiendo utilizar nuestro IDE favorito. Y todo ello sin perder simplicidad, pues el uso de Blade CLI y de las tareas de Gradle es sencillo: con un par de comandos tenemos todo montado.

10. Referencias