Ejemplo de multiproyecto con Gradle

Publicado por pico.dev el , actualizado el .
blog-stack java planeta-codigo programacion tapestry
Comentarios

En un proyecto grande podemos tener necesidad de dividir el monolito al menos en varios módulos y yendo un paso más lejos en microservicios. La herramienta de construcción que usemos deberá de facilitarnos automatizar la tarea de construcción del código fuente de cada módulo individual, de todos a la vez o de los microservicios si tienen alguna dependencia compartida. En el artículo y ejemplo explicaré cómo usando Gradle podemos dividir el proyecto en varios módulos. No deja de ser un ejemplo pero es bastante completo y está formado por dos aplicaciones web, una librería de componentes y otra librería con el modelo de persistencia, usa Spring, jOOQ, Tapestry, PostgreSQL, Docker, Liquibase, …

Java
Gradle

Cuando una aplicación o proyecto crece en algún momento podemos tener necesidad de partir el monolito en varios módulos más pequeños y más manejables. Las arquitecturas basadas en microservicios proponen en vez de tener una aplicación grande que contenga toda la funcionalidad dividirla en varios servicios manejables, pequeños y lo más independientes posible. En el libro Building Microservices explican muy bien la idea y conceptos de los microservicios. La división de una aplicación implica tener un repositorio de código fuente para cada proyecto, probablemente algunos proyectos dependan de otros y haya alguno que sea utilizado por varios como uno de utilidades. Aunque diría que en los microservicios se prefiere en cierta medida duplicar código que compartir para que cada proyecto tenga un ciclo de vida independiente, esto permite desplegarlos individualmente, aún así podemos aceptar compartir cierto código de utilidades o componentes, necesitando que unos proyectos dependan de otros.

Tener varios proyectos con dependencias entre ellos exige de la herramienta de construcción que esto sea posible y sencillo. En este artículo comentaré como crear un proyecto compuesto de varios componentes con la herramienta de construcción Gradle. El ejemplo consistirá en dos aplicaciones web basadas en el framework web Apache Tapestry, una será la que vea el público (web) y otra de administración (back), estas dos aplicaciones compartirán una librería de componentes de Tapestry comunes como un layout (library), la cabecera y pie de las páginas de cada proyecto web, finalmente existirá una librería con métodos o servicios de utilidad comunes y el modelo de datos a persistir en una base de datos relacional usada tanto en las aplicaciones web como por la librería de componentes (core).

Necesitaremos 4 proyectos para los módulos y 5 proyectos Gradle, uno para cada módulo y otro que los englobe a todos. La estructura de directorios y archivos relativos a Gradle será la siguiente:

En el archivo build.gradle global podemos incluir las cosas comunes a todos los proyectos como dependencias o plugins, en el archivo settings.gradle definimos de que componentes está formado el proyecto. Las cosas comunes a todos los proyectos será el uso del plugin java y eclipse, el repositorio de dependencias de mavenCentral, algunas dependencias y una tarea para instalar el wrapper de Gradle que nos servirá para usarlo sin necesidad de instalar nada (se descargarán sus binarios automáticamente).

Podemos ver los módulos (o proyectos como los llama Gradle) de los que se compone la aplicación y las tareas que podemos ejecutar con:

Comandos básicos de Gradle
En los proyectos web incluiremos como dependencias las propias de Apache Tapestry, el proyecto _library_ y _core_, también aplicaremos el _plugin_ de [Tomcat][tomcat] para poder iniciar los proyectos con Gradle configurándolos para que cada uno se inicie en un puerto distinto 8080/8443 para web y 9080/9443 para back.

En el proyecto library incluiremos los componentes que podemos reutilizar en cualquiera de los proyectos, será una librería de componentes de Apache Tapestry. Esta librería de componentes no es más que un archivo jar, cada proyecto que necesite utilizarlos basta con que lo incluya como una dependencia.

En el último proyecto core incluiremos una clase de utilidad con los típicos métodos estáticos, incluiremos un servicio que nos facilitará la persistencia y una clase de modelo a persistir en una base de datos PostgreSQL generada con jOOQ como alternativa a Hibernate, añadiendo o eliminando instancias persistidas son visualizadas desde el proyecto web y back.

Para arrancar los proyectos web deberemos inicializar la base de datos. Con docker-compose y el archivo descriptor de Docker) iniciamos el contenedor de Docker con la base de datos PostgreSQL. La base de datos deberemos crearla manualmente pero el esquema donde se guardarán los datos los crearemos con Liquibase que nos permite hacer modificaciones a una BBDD, deberemos tenerlo instalado y su comando incluido en el PATH del sistema para este ejemplo.

Una vez tenemos en cada directorio los archivos build.gradle y el resto de archivos que necesite cada proyecto (archivos .java, .tml, …) podemos construir los módulos a la vez o de forma individual. Podemos iniciar los proyectos web y acceder a ellos con el navegador con:

Iniciando aplicación backoffice
Creando un producto desde la consola de PostgreSQL y refrescando la página en el proyecto de _web_ o _back_ veremos que se visualizan sus datos.
Aplicación backoffice

El código fuente completo del ejemplo puedes verlo y descargarlo desde su repositorio de GitHub.

Portada libro: PlugIn Tapestry

Libro PlugIn Tapestry

Si te interesa Apache Tapestry descarga gratis el libro de más de 300 páginas que he escrito sobre este framework en el formato que prefieras, PlugIn Tapestry: Desarrollo de aplicaciones y páginas web con Apache Tapestry, y el código de ejemplo asociado. En el libro comento detalladamente muchos aspectos que son necesarios en una aplicación web como persistencia, pruebas unitarias y de integración, inicio rápido, seguridad, formularios, internacionalización (i18n) y localización (l10n), AJAX, ... y como abordarlos usando Apache Tapestry.


Yo apoyo al software libre