Copiar dependencias al directorio target en Maven

Cuando desarrollamos un proyecto J2SE en Maven2, a menudo queremos que al empaquetar nuestro proyecto, las librerías de las que dependen se copien las dependencias del proyecto al directorio target/lib.

Este comportamiento, sencillo a primera vista, se convirtió para mí en una pequeña odisea que finalmente solucioné gracias al siguiente enlace:
En él se hace la misma pregunta y los comentarios dan la solución. A continuación expongo mi adaptación a mi proyecto.

Supongamos que tenemos un proyecto Java hecho en Maven, el plugin que tenemos que configurar es maven-dependency-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-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>target/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
...
</project>


Con esta configuración estamos especificando que en la fase 'package' (consultar el ciclo de vida Maven para más información sobre las fases) se copien las dependencias al directorio 'target/lib'. De esta forma, cuando construyamos el JAR de nuestro proyecto, éste será copiado al directorio 'target' y las librerías de las que depende se copiarán al directorio 'target/lib'.
También puede interesar:
Configurar el MANIFEST con Maven para añadir librerías al classpath
Hacer que Maven ignore ciertos recursos al empaquetar el proyecto

Actualización: 27/10/2009
En los comentarios se lanzan dos cuestiones que veremos cómo resolverlas a continuación.

Incluir una carpeta de recursos en el JAR
Por defecto, Maven espera encontrar los ficheros .java en 'src/main/java' y el resto de ficheros de recursos en 'src/main/resources'. Si en un proyecto JAR tenemos por ejemplo (tal y como se plantea) una carpeta de iconos, basta con poner dicha carpeta dentro de 'src/main/resources' (por ejemplo 'src/main/resources/imagenes/iconos'). Al empaquetar el proyecto, dentro del fichero JAR encontraremos la carpeta 'imagenes/iconos' (y por supuesto todos los ficheros dentro de la misma).

Cabe destacar que, al final de la fase de compilación ('mvn compile') tendremos dentro del directorio 'target/classes' todo lo que irá dentro del JAR.

Copiar algo (X) a un directorio determinado (Y) en una fase determinada (Z)
Ahora estamos en el caso en el que queremos copiar dentro del directorio 'target' (o en cualquier otro directorio) algunas carpetas o ficheros que no queremos que aparezcan en el JAR (si sí queremos que aparezcan en el JAR basta con tenerlas en 'src/main/resources' tal y como se ha comentado anteriormente). Supongamos lo siguiente:
  • Tenemos una carpeta 'conf' en la raíz del proyecto y dentro los ficheros que queremos copiar a 'target/configuracion'
  • Queremos que esto se realice en la fase 'compile'

Bastaría con trabajar con el plugin maven-resources-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-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<!-- Aqui ponemos la fase que queramos -->
<phase>compile</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<!-- Aqui ponemos el directorio destino -->
<outputDirectory>${basedir}/target/configuracion</outputDirectory>
<resources>  
<!-- 
Aqui ponemos los directorios o recursos que queremos copiar.
Añadiremos tantos elementos resource como queramos
-->        
<resource>
<directory>conf</directory>
</resource>
</resources>          
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
...
</project>

3 comentarios:

Anónimo dijo...

como hago si quiero copiar unos archivos propios de configuracion al target??? que plugin debo usar??

Ademas que sucede si quiero copiar una carpeta de iconos
al jar final??? porque cuando compilo me quita la carpeta
con los iconos del sistema del jar.

Federico

Gracias amigo...

Fede dijo...

Buenas Federico, he modificado la entrada para dar respuesta a tus preguntas. Espero que haya podido resolver tus dudas.

Saludos.

PD: Perdón por la tardanza pero no había visto el comentario.

JAVAMAN dijo...

Aqui les comparto este tutorial de MAVEN que prepare hace tiempo:

http://viviendoconjavaynomoririntentandolo.blogspot.com/search/label/Maven

Publicar un comentario