Configurar el MANIFEST con Maven para añadir librerías al classpath

En una de las anteriores entradas de este blog (http://tutorialexception.blogspot.com/2009/03/copiar-dependencias-al-directorio.html) se vio como copiar las dependencias de un proyecto al directorio 'target/lib'. En este blog voy a explicar cómo configurar Maven para que al empaquetar nuestro proyecto JAR y copiar las dependencias al directorio 'target/lib' podamos ejecutarlo con un simple "java -jar proyecto.jar".

Para poder alcanzar este objetivo, lo que tenemos que conseguir es que el fichero MANIFEST configure el classpath indicando las librerías de las que depende. Esto se consigue configurando el plugin maven-jar-plugin:


<project
xmlns="http://maven.apache.org/POM/4.0.0"
xsi="http://www.w3.org/2001/XMLSchema-instance"
schemalocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>     
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<!-- Opcional, sirve para indicar la clase Main -->
<mainClass>org.dg.view.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
...
</plugins>
...
</build>
...
</project>

Como puede observarse, simplemente tenemos que indicarle que añada el classpath al fichero MANIFEST y que el prefijo de las librerías será 'lib/'. De esta forma, si nos situamos en el directorio 'target' donde se encuentra el JAR generado de nuestro proyecto, podemos ejecutarlo (mediante 'java -jar proyecto.jar' por ejemplo) y las librerías de las que depende serán encontradas en el directorio 'target/lib'.

Además, se ha incluído el elemento para configurar la clase Main:

<mainClass>org.dg.view.Main</mainClass>

Espero que os sirva de ayuda.

2 comentarios:

fog dijo...

Me ayudó, gracias por compartir la info.

Anónimo dijo...

Hola, muy bueno el ejemplo!, gracias.
Te hago una consulta, como puedo hacer para que la carpeta lib me quede dentro del jar?
Muchas gracias!

Publicar un comentario