mvn modulos manejo library gestor estructura entre empaquetar dependencias dependencia java maven dependencies maven-2 maven-3

modulos - maven java



obligar a Maven a copiar dependencias en target/lib (16)

¿Cómo puedo copiar las dependencias en tiempo de ejecución de mi proyecto en la carpeta target/lib ?

Tal como está ahora, después de que mvn clean install la carpeta de target solo contiene el archivo jar de mi proyecto, pero ninguna de las dependencias de tiempo de ejecución.



El mejor enfoque depende de lo que quieras hacer:

  • Si desea agrupar sus dependencias en un archivo WAR o EAR, simplemente configure el tipo de empaquetado de su proyecto en EAR o WAR. Maven agrupará las dependencias en la ubicación correcta.
  • Si desea crear un archivo JAR que incluya su código junto con todas sus dependencias, use el complemento de assembly con el descriptor jar-with-dependencies . Maven generará un archivo JAR completo con todas sus clases y las clases de cualquier dependencia.
  • Si desea simplemente arrastrar sus dependencias en el directorio de destino de forma interactiva, use el complemento de dependency para copiar sus archivos en.
  • Si desea incluir las dependencias para algún otro tipo de procesamiento, probablemente necesitará generar su propio complemento. Hay API para obtener la lista de dependencias y su ubicación en el disco. Tendrás que llevarlo desde allí ...

Es una solución pesada para integrar dependencias pesadas, pero el Complemento de Ensamblaje de Maven hace el truco por mí.

La respuesta de @ Rich Seller debería funcionar, aunque para casos más simples solo necesita este extracto de la guía de uso :

<project> <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2.2</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> </plugins> </build> </project>


Esto funciona para mí:

<project> ... <profiles> <profile> <id>qa</id> <build> <plugins> <plugin> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <phase>install</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> </project>


Intenta algo como esto:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>MainClass</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.4</version> <executions> <execution> <id>copy</id> <phase>install</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory> ${project.build.directory}/lib </outputDirectory> </configuration> </execution> </executions> </plugin>


Puede usar el Complemento de sombra para crear un frasco uber en el que puede agrupar todas sus dependencias de terceros.


Si desea entregar un paquete de su aplicación jar, junto con todas sus dependencias y algunos scripts para invocar MainClass, mire el appassembler-maven-plugin .

La siguiente configuración generará secuencias de comandos para Windows y Linux para iniciar la aplicación (con una ruta generada que hace referencia a todos los archivos jar de dependencia, descargar todas las dependencias (en una carpeta lib debajo del destino / appassembler). El assembly se puede usar para empaquetar el conjunto directorio appassembler a un archivo zip que se instala / implementa junto con el archivo jar en el repositorio.

<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>appassembler-maven-plugin</artifactId> <version>1.0</version> <executions> <execution> <id>generate-jsw-scripts</id> <phase>package</phase> <goals> <goal>generate-daemons</goal> </goals> <configuration> <!--declare the JSW config --> <daemons> <daemon> <id>myApp</id> <mainClass>name.seller.rich.MyMainClass</mainClass> <commandLineArguments> <commandLineArgument>start</commandLineArgument> </commandLineArguments> <platforms> <platform>jsw</platform> </platforms> </daemon> </daemons> <target>${project.build.directory}/appassembler</target> </configuration> </execution> <execution> <id>assemble-standalone</id> <phase>integration-test</phase> <goals> <goal>assemble</goal> </goals> <configuration> <programs> <program> <mainClass>name.seller.rich.MyMainClass</mainClass> <!-- the name of the bat/sh files to be generated --> <name>mymain</name> </program> </programs> <platforms> <platform>windows</platform> <platform>unix</platform> </platforms> <repositoryLayout>flat</repositoryLayout> <repositoryName>lib</repositoryName> </configuration> </execution> </executions> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-4</version> <executions> <execution> <phase>integration-test</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptors> <descriptor>src/main/assembly/archive.xml</descriptor> </descriptors> </configuration> </execution> </executions> </plugin>

El descriptor de ensamblaje (en src / main / assembly) para empaquetar el direcotry como un zip sería:

<assembly> <id>archive</id> <formats> <format>zip</format> </formats> <fileSets> <fileSet> <directory>${project.build.directory}/appassembler</directory> <outputDirectory>/</outputDirectory> </fileSet> </fileSets> </assembly>


Si desea hacer esto de forma ocasional (y, por lo tanto, no quiere cambiar su POM), intente esta línea de comandos:

mvn dependency:copy-dependencies -DoutputDirectory=${project.build.directory}/lib

Si omite el último argumento , las dependencias se colocan en target/dependencies .


Si haces de tu proyecto una guerra o un tipo de oreja maven copiará las dependencias.



Solo para explicar lo que ya se ha dicho en breve. Quería crear un archivo JAR ejecutable que incluyera mis dependencias junto con mi código. Esto funcionó para mí:

(1) En el pom, debajo de <build> <plugins>, incluí:

<plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-5</version> <configuration> <archive> <manifest> <mainClass>dk.certifikat.oces2.some.package.MyMainClass</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin>

(2) Ejecución del ensamblaje de compilación mvn: el ensamblaje produjo el archivo my-project-0.1-SNAPSHOT-jar-with-dependencies.jar deseado en el directorio de destino del proyecto.

(3) Ejecuté el JAR con java -jar mi-proyecto-0.1-SNAPSHOT-jar-with-dependencies.jar


Todo lo que necesita es el siguiente fragmento de código dentro de la build/plugins pom.xml:

<plugin> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <phase>prepare-package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin>

Lo anterior se ejecutará en la fase de package cuando ejecute

mvn clean package

Y las dependencias se copiarán en el directorio de salida especificado en el fragmento, es decir, lib en este caso.

Si solo desea hacerlo ocasionalmente, no se requieren cambios en pom.xml. Simplemente ejecuta lo siguiente:

mvn clean package dependency:copy-dependencies

Para anular la ubicación predeterminada, que es ${project.build.directory}/dependencies , agregue una propiedad del sistema llamada outputDirectory , es decir

-DoutputDirectory=${project.build.directory}/lib


Una solución simple y elegante para el caso en el que se necesita copiar las dependencias en un directorio de destino sin usar ninguna otra fase de Maven (esto me pareció muy útil cuando se trabaja con Vaadin).

Ejemplo completo de pom:

<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>groupId</groupId> <artifactId>artifactId</artifactId> <version>1.0</version> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.1.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <phase>process-sources</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${targetdirectory}</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>

Luego ejecuta mvn process-sources

Las dependencias del archivo jar se pueden encontrar en /target/dependency


suponiendo que

  • no quieres alterar el pom.xml
  • no desea un ámbito de prueba (por ejemplo, junit.jar) o dependencias proporcionadas (por ejemplo, wlfullclient.jar)

Aquí está lo que funcionó para mí:

mvn install dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=target/lib


<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.edge</groupId> <artifactId>STORM2</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>STORM2</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <profiles> </profiles> <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.edge.STORM2.LogAnalyserStorm</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-core</artifactId> <version>1.1.1</version> <scope>provided</scope> </dependency> </dependencies> </project>

Este es mi pom, ¿me estoy perdiendo algo? el jar creado con dependencias, no contiene ninguna clase lib o jar


mvn install dependency:copy-dependencies

Funciona para mí con el directorio de dependencias creado en la carpeta de destino. ¡Gusta!