Veremos cómo configurar el
POM de un proyecto de una aplicación de consola para obtener un archivo
zip conteniendo la aplicación y todas sus dependencias (JARs), y un directorio con los archivos de configuración de la aplicación.
Llamaremos a nuestro proyecto
console-poc, que va a ser también el
artifactId del POM.
Estructura de directorios
Vamos a agregar algunos directorios a la estructura de directorios de nuestro proyecto que es la standard de
Maven.
Agregaremos
src/main/bin, para contener los scripts de ejecución de la aplicación y
src/main/config para contener los archivos de configuración:
src/
|-- main
| |-- bin
| | |-- run.cmd
| | `-- run.sh
| |-- config
| | |-- application.properties
| | |-- applicationContext.xml
| | `-- log4j.xml
| `-- java
| `-- com
...
JAR plugin: agregar el directorio src/main/config al Manifest
Configuramos el
plugin de JAR en el
POM para que agregue el directorio
src/main/config al classpath definido en el
Manifest de la aplicación.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!-- esto hace que al crear el jar se nombre console-poc.jar en vez de console-poc-1.0.0.jar si la versión del artifact es 1.0.0 -->
<finalName>${artifactId}</finalName>
<archive>
<manifest>
<!-- agregar todos los .jar de las dependencias en el classpath del Manifest -->
<addClasspath>true</addClasspath>
<!-- vamos a agregar antes del nombre de cada .jar en el classpath del Manifest el prefijo lib/ -->
<!-- porque luego al construir el assembly copiaremos los .jar de las dependencias al directorio lib/-->
<classpathPrefix>lib/</classpathPrefix>
<!-- la clase que se ejecuta cuando se ejecute "java -jar console-poc.jar" -->
<mainClass>ar.com.kamikazesoftware.poc.console.App</mainClass>
</manifest>
<manifestEntries>
<!-- además de los nombres de las dependencias, agregar el directorio config al classpath del Manifest -->
<Class-Path>config/</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
Assembly Plugin
Configuramos el
plugin de Assembly para usar un descriptor llamado
distribution.xml que el plugin tomará del directorio
src/main/assembly:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<!-- el descriptor contiene la información para armar el assembly -->
<descriptor>src/main/assembly/distribution.xml</descriptor>
</descriptors>
</configuration>
<executions>
<!-- ejecutar el goal 'single' del plugin de assembly al ejecutar mvn package -->
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
En execution se define que se ejecute el goal 'single' del plugin de assembly cuando se ejecute 'mvn package' desde el directorio de nuestro proyecto, es decir que construya el assembly cuando se ejecute 'mvn package'.
A continuación el descriptor
distribution.xml comentado:
<assembly>
<id>distribution</id>
<!-- el formato de salida es archivo .zip -->
<formats>
<format>zip</format>
</formats>
<!-- incluir todas las dependencias runtime en el directorio lib del archivo .zip de salida-->
<dependencySets>
<dependencySet>
<outputDirectory>/lib</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
</dependencySet>
</dependencySets>
<fileSets>
<!-- incluir el jar de la aplicación en el directorio base del archivo .zip -->
<fileSet>
<directory>target</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<!-- copiar los scripts al directorio base del archivo .zip -->
<fileSet>
<directory>src/main/bin</directory>
<outputDirectory></outputDirectory>
<includes>
<include>run.cmd</include>
<include>run.sh</include>
</includes>
</fileSet>
<!-- copiar los archivos de configuración al directorio config del archivo .zip -->
<fileSet>
<directory>src/main/config</directory>
<outputDirectory>/config</outputDirectory>
<includes>
<include>**/**</include>
</includes>
</fileSet>
</fileSets>
</assembly>
Script para ejecutar la aplicación desde linea de comandos
El script
run.sh (y run.cmd la versión Windows), contiene la siguiente linea que ejecuta la máquina virtual de java parametrizada para ejecutar la aplicación:
java -jar console-poc.jar
Ensamblado
Con esta configuración ejecutamos
mvn clean package
en una terminal, parados en el directorio de nuestro proyecto, y en el directorio
target se creará un archivo console-poc-0.0.1-SNAPSHOT.zip con el assembly.
Ver también
En una futura ocasión hablaremos de otro plugin para armar paquetes, el
Appassembler plugin que entre otras cosas arma el script de ejecución automaticamente.