Generación del manifest de un JAR utilizando Maven
Al empaquetar un artefacto Java, puede interesarnos agregar información al manifest generado. El manifest es un archivo que se crea dentro de nuestro JAR (en la ruta META-INF/MANIFEST.MF) con información bastante diversa acerca del JAR, en forma de "propiedad: valor". Esta información puede ser acerca de la versión de código empaquetada, del classpath, de la clase que se ejecutará al correr java -jar [archivo.jar] o inclusive propiedades personalizadas que tienen significado para el usuario de ese JAR.
Utilizando Maven podemos generar automáticamente el archivo MANIFEST.MF. Para ello, debemos editar el archivo pom.xml agregando la configuración del manifest al plugin que se encarga de empaquetar nuestro proyecto (maven-jar-plugin). Veamos un ejemplo:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.josearrarte</groupId>
<artifactId>tests</artifactId>
<version>0.0.1-SNAPSHOT</version>
<url>http://www.josearrarte.com/blog</url>
<dependencies>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<classpathPrefix>lib</classpathPrefix>
<addClasspath>true</addClasspath>
<mainClass>com.josearrarte.demo.MainClass</mainClass>
</manifest>
<manifestEntries>
<sample_entry>sample_value</sample_entry>
<url>${project.url}</url>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
Lo más importante del ejemplo está en la parte de configuración del maven-jar-plugin. Ahí tenemos tres elementos configurados:
mainClass: Se utiliza para determinar qué clase contiene el métodomaindel JAR cuando ejecutamos la JVM con el parámetro-jar [archivo.jar]addClasspath: los valores posibles sontrueofalse. Si el valor estruese agregará una entradaClass-Pathal manifest, con la lista de JARs de los cuales depende nuestro artefacto (algunos scopes no serán considerados, por ejemplo test)classpathPrefix: este elemento de configuración es útil cuando queremos referenciar los JARs de los que depende nuestro artefacto y están en un directorio diferente. Se pueden utilizar paths relativos
Los elementos dentro de sirven para agregar propiedades adicionales al manifest. Se pueden utilizar variables del estilo de ${project.build.finalName} que serán sustituidas sus valores reales. No conozco todas las variables existentes, pero aquí hay una lista que parece bastante completa.
El archivo META-INF/MANIFEST.MF resultante de empaquetar el proyecto será muy similar al siguiente:
Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Created-By: Apache Maven Built-By: jarrarte Build-Jdk: 1.6.0_19 Main-Class: com.josearrarte.demo.MainClass sample_entry: sample_value url: http://www.josearrarte.com/blog Class-Path: lib/commons-dbcp-1.4.jar lib/commons-pool-1.5.4.jar
En el pom.xml del proyecto de ejemplo tenemos una dependencia a commons-dbcp, que a su vez depende de commons-pool. Esto se ve reflejado al construir el valor classpath en el manifest, que contiene las dos dependencias.
Referencias
http://tutorialexception.blogspot.com/2009/03/configurar-el-manifest-con-maven-para.html
http://maven.apache.org/
http://maven.apache.org/shared/maven-archiver/examples/classpath.html
http://maven.apache.org/guides/mini/guide-manifest.html
http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide
http://java.sun.com/docs/books/tutorial/deployment/jar/modman.html
Posts relacionados (generados automáticamente):
- Crear un nuevo proyecto Java con Maven
- Evitar la ejecución de tests o ignorar resultados al utilizar Maven
- “Unmappable character for encoding UTF-8″ al compilar proyectos Java con Maven
- Problemas en Eclipse de proyectos Maven con dependencias a AspectJ
- m2eclipse: un plugin de Eclipse para proyectos de Maven
- Catálogos web de artefactos de Maven
- Cambiar la JVM utilizada por Eclipse
- Audio y video en Java utilizando ffmpeg, Jffmpeg, y JMF

Hola, estoy haciendo lo mismo que pones en el post, pero me gustaria que este plugin creara la carpeta lib y metiera alli todos los jars con las dependencias de este jar. ¿Es esto posible?
¿Como estás Rodrigo? Creo que por lo que dices, estás buscando la funcionalidad de dependency:copy-dependencies, que te arma un directorio con todas las dependencias (incluyendo transitivas) de tu proyecto. Tiene un parámetro outputDirectory para definir a qué directorio copiar los JARs. Cuéntame cómo te fue. ¡Suerte!
Buenas, en primer lugar enhorabuena por tu post, está muy completo y bien explicado. También quería agradecerte el que me hayas citado, gracias a eso he encontrado este blog
.
De camino aprovecho para contestar a Rodrigo, ya que escribí un post hace tiempo acerca de eso mismo que preguntas: http://tutorialexception.blogspot.com/2009/03/copiar-dependencias-al-directorio.html. Espero que te sirva.
Saludos!