Inicio > Java, Maven > Generación del manifest de un JAR utilizando Maven

Generación del manifest de un JAR utilizando Maven

Viernes, 30 de abril de 2010 jarrarte Dejar un comentario Ir a comentarios

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étodo main del JAR cuando ejecutamos la JVM con el parámetro -jar [archivo.jar]
  • addClasspath: los valores posibles son true o false. Si el valor es true se agregará una entrada Class-Path al 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):

  1. Crear un nuevo proyecto Java con Maven
  2. Evitar la ejecución de tests o ignorar resultados al utilizar Maven
  3. “Unmappable character for encoding UTF-8″ al compilar proyectos Java con Maven
  4. Problemas en Eclipse de proyectos Maven con dependencias a AspectJ
  5. m2eclipse: un plugin de Eclipse para proyectos de Maven
  6. Catálogos web de artefactos de Maven
  7. Cambiar la JVM utilizada por Eclipse
  8. Audio y video en Java utilizando ffmpeg, Jffmpeg, y JMF

Categories: Java, Maven Tags: ,
  1. Rodrigo
    Lunes, 31 de mayo de 2010 a las 05:28 | #1

    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?

    • Jueves, 3 de junio de 2010 a las 20:29 | #2

      ¿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!

  2. Lunes, 14 de junio de 2010 a las 04:17 | #3

    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!

  1. Sin trackbacks aún.