En Liferay se pueden implementar distintos tipos de plugins como portlets tipo WAR, hooks o aplicaciones web. Sin embargo, la manera más efectiva es mediante Módulos OSGi.
Los módulos ofrecen estos beneficios:
- Mejor encapsulación: las únicas clases que un módulo expone públicamente son aquellas en paquetes que exporta explícitamente.
- Dependencias por paquete: las dependencias están especificadas por el paquete Java, no por el archivo JAR.
- Ligero: un módulo puede ser tan pequeño como desee. A diferencia de un complemento tradicional, que puede requerir varios archivos descriptores, un módulo requiere solo un único archivo descriptor: un manifiesto JAR estándar.
- Reutilización fácil: los módulos se prestan bien para desarrollar fragmentos de código pequeños y altamente cohesivos. Se pueden combinar para crear aplicaciones que son más fáciles de probar y mantener. Los módulos se pueden distribuir públicamente (p. ej., en Maven Central ) o de forma privada.
- Descriptores en contexto: donde los complementos usan archivos descriptores (p. ej., web.xml, portlet.xml, etc.) para describir clases, las clases de módulos usan anotaciones OSGi para describirse a sí mismas. Por ejemplo, una clase de portlet de módulo puede usar las propiedades de anotación del servicio OSGi para especificar su nombre, nombre para mostrar, paquete de recursos, parámetros de representación públicos y mucho más. En lugar de especificar esa información en archivos descriptores separados del código, los especifica en contexto en el código.
A continuación vamos a mostrar como crear un módulo OSGi.
Requisitos:
- Utilizar IntelliJ con el plugin de Liferay
- Tener una instancia de Liferay funcionando
Paso 1:
Nos ubicamos en nuestro proyecto de Liferay, hacemos botón derecho en la carpeta “modules”, seleccionamos la opción New -> Module…
Paso 2:
Especificamos:
- El nombre del módulo: MiHolaMundo
- El lenguaje: Java
- El build system: Gradle
Y finalmente hacemos click en Create. Esto debería crear una carpeta con el nombre del módulo y dentro de la misma el archivo “build.gradle” y la carpeta “src”
Paso 3:
Crear una clase haciendo botón derecho en la carpeta “src/main/java”, seleccionamos “New” -> “Java Class” y le colocamos el nombre, por ejemplo: “com.pnt.MiHolaMundo”. En este caso se generará una clase con el nombre “MiHolaMundo”
Paso 4:
Vamos al archivo “build.gradle” que se encuentra en la raiz de nuestro módulo. Allí agregamos la dependencia de anotaciones de OSGi
compileOnly group: "org.osgi", name: "org.osgi.service.component.annotations", version: "1.3.0"
Paso 5:
Hacer click derecho sobre el modulo creado y agregarun nuevo archivo llamado "bnd.bnd". Este archivo genera el manifiesto OSGi del módulo en el archivo META-INF/MANIFEST.MF del JAR del módulo, sin este archivo no podríamos realizar el deploy correctamente.
Una vez creado el archivo, vamos a ingresar lo siguiente dentro del mismo:
Bundle-SymbolicName: my.service.project Bundle-Version: 1.0.0
Paso 6:
Anotar la clase creada, con la etiqueta @Component. Esta etiqueta nos va a permitir establecer configuraciones esenciales para que nuestro módulo se ejecute. Así como lo vemos en la siguiente imagen. Como configuración inicial, vamos a establecer la siguientes características:
- “inmediate = true” : En tiempo de ejecución, activa el componente inmediatamente después de que se resuelvan las dependencias.
- “service = MiHolaMundo.class” : En nuestro ejemplo, la clase implementa un servicio propio. Aunque es bueno mencionar que los componentes de servicio normalmente implementan servicios para clases de interfaz.
Paso 7:
Ahora que tenemos la clase configurada, es momento de crear el método que queremos que se ejecute. En este ejemplo vamos a hacer un “Hola mundo, somos PNT” . Para ello, vamos a anotar al método con la etiqueta @Activate. La anotación @Activate indica al entorno de tiempo de ejecución OSGi que invoque este método en la activación del componente.
Paso 8:
Ya tenemos listo nuestro módulo OSGi, sólo restaría hacer el Deploy para comprobar su funcionamiento. Hacemos botón derecho en el módulo, vamos a seleccionar la opción “Liferay” y allí “Deploy”. Una vez que se hace el Deploy nos queda ubicar en los logs, el mensaje que configuramos. Para ello, tenemos que iniciar nuestro servidor de liferay.
Listo!
Como podemos ver, en los logs aparece el "Hola mundo, somos PNT" que implementamos mediante el modulo OSGi!