Apache Maven War overlay con dependencias locales

0
6664

En el caso que necesitemos empaquetar los recursos locales en el target war de nuestra aplicación web, podemos hacer uso del plugin empaquetados de war que ofrece Apache Maven.

0. Índice de contenidos

1. Introducción

Algunas veces nos podemos encontrar con una situación (que aun no siendo la ideal) necesitemos hacer un overlay de recursos o dependencias que no podamos disponer de ellos en un repositorio remoto (Nexus, por ejemplo), o que por decisiones de diseño (aunque este tipo
de diseños habría que evitarlos) las dependencias se encuentren como recursos locales del proyecto web.

En el caso que necesitemos empaquetar los recursos locales en el target war de nuestra aplicación web, podemos hacer uso del plugin empaquetados de war que ofrece Apache Maven:
maven-war-plugin.
Habrá que configurar dicho plugin para obtener el recurso local como dependencia a la hora de realizar el overlay. Lo veremos en los siguientes apartados.

2. Entorno

  • Macbook pro core i7 con 16gb RAM
  • SO: Yosemite
  • IDE: IntelliJ IDEA 14
  • Gestor de proyectos: Apache Maven 3.3.3
  • Java: JDK 1.8

3. Problema inicial

Pongamos una situación de ejemplo:

Supongamos que tenemos una aplicación web gestionada con Maven:

screen1

Esta aplicación web estará integrada como recurso local en otra aplicación web en
una carpeta lib/ dentro del proyecto:

screen2

¿Cómo podríamos realizar el overlay de dicho WAR, si no dispongo de un repositorio de artefactos (como viene siendo el diseño más común de gestión de dependencias),
por lo que las dependencias de Maven no se me van a resolver correctamente? Lo veremos a continuación 😉

4. Solución war overlay local

La solución será muy sencilla: Haremos uso del plugin de empaquetado de wars de Maven y jugaremos con la gestión de dependencias con recursos locales que te ofrece
el core de Maven.

Empecemos por lo segundo. Sabemos que las dependencias en Apache Maven pueden tener varios niveles de alcance o ‘scope’:
scopes dependencias Maven. Estos niveles
de alcance permitirán indicar a Maven cómo tiene que gestionar esas dependencias, si es requerida a nivel de compilación, de runtime, de test, o lo que nos importa en este tutorial,
si la dependencia se provee de forma local (system). Haremos uso de este nivel de alcance para indicar que disponemos de un recurso local que se usará como dependencia en nuestra aplicación web.

Ahora nos falta la parte de configuración del maven-war-plugin. Sabemos que el plugin hace uso de las dependencias que tengamos configuradas en el proyecto (a nivel de <dependencies>). Con esto
no tendremos problemas ya que previamente hemos configurado nuestra dependencia del WAR local. Ahora hará falta incluir dicha dependencia en la parte <overlays> del plugin:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <overlays>
            <overlay>
                <artifactId>exampleWar</artifactId>
                <groupId>com.autentia.tutoriales</groupId>
            </overlay>
        </overlays>
    </configuration>
</plugin>

Con esto, el plugin obtendrá la dependencia correctamente, y realizará el overlay con el war actual. La estructura de directorios que se genera dentro del war resultante será la siguiente:


screen3

Como vemos, podemos identificar recurso.txt y MyClass.class como recurso del war exampleWar-1.0-SNAPSHOT.war, y recurso2.txt como recurso de la aplicación web con la que estamos trabajando,
por lo que el overlay se ha ejecutado correctamente.

5. Conclusiones

Como hemos visto en este tutorial, se puede hacer uso del plugin de war overlay de forma muy sencilla para realizarlo sobre dependencias que se encuentren en nuestro filesytem, o en una ruta interna del proyecto.
Lo mismo se podría hacer si tenemos por ejemplo un repositorio SVN, o si accediéramos al recurso vía FTP, Samba, etc. (configurando los repositorios adecuadamente).

Se puede consultar el proyecto en github aquí

6. Referencias

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad