obligar a Maven a copiar dependencias en target / lib

252

¿Cómo copio las dependencias de tiempo de ejecución de mi proyecto en la target/libcarpeta?

Como es ahora, después de que mvn clean installla targetcarpeta contenga solo el jar de mi proyecto, pero ninguna de las dependencias de tiempo de ejecución.

Miguel
fuente
Por qué necesitas esto ? ¿Cuál es el tipo de su proyecto maven? tarro?
Alexandre Victoor
El tipo de mi proyecto maven es JAR. Necesito esto porque hay muchas dependencias y estoy tratando de implementar el jar como ejecutable.
Michael
2
Precaución con los ensamblajes: si tiene paquetes / clases superpuestos entre los departamentos, probablemente lo pasará mal.
demaniak

Respuestas:

260

Esto funciona para mi:

<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>
Georgy Bolyuba
fuente
11
Si desea que esto suceda todo el tiempo, elimine los envoltorios <profiles> ... <profile> y haga que la etiqueta <build> esté justo debajo de <project>
Dan Halbert el
3
@Georgy, esto no coquetea los frascos en lib /, sino que incluye las clases en el proyecto compilado
Midhat
55
Esto está bien, pero también está copiando las dependencias de prueba. Me agrego la excludeScopeopción ( maven.apache.org/plugins/maven-dependency-plugin/… ).
Alfonso Nishikawa
Funciona bien, pero no es necesario colocar la etiqueta de compilación dentro de las etiquetas de perfil.
Julien BRENELIERE
2
Nota: <excludeScope>test</excludeScope>va dentro del configurationnodo.
Jesse Chisholm
84

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 paquete 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 ensamblaje con el descriptor jar-with-dependencies . Maven generará un archivo JAR completo con todas sus clases más las clases de cualquier dependencia.
  • Si desea simplemente extraer sus dependencias en el directorio de destino de forma interactiva, utilice el complemento de dependencia para copiar sus archivos.
  • Si desea obtener 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í ...
John Stauffer
fuente
80
mvn install dependency:copy-dependencies 

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

usuario3286149
fuente
35

Eche un vistazo al complemento de dependencia de Maven , específicamente, el objetivo de dependencia: dependencias de copia . Eche un vistazo al ejemplo bajo el título La dependencia: copia-dependencias mojo . Establezca la propiedad de configuración outputDirectory en $ {basedir} / target / lib (creo que tendrá que probar).

Espero que esto ayude.

Travis B. Hartwell
fuente
15
Alternativamente, puede usar $ {project.build.directory} / lib en lugar de $ {basedir} / target / lib
Cuga
31

Una solución simple y elegante para el caso en que uno necesita copiar las dependencias en un directorio de destino sin usar ninguna otra fase de Maven (esto me pareció muy útil cuando trabajé 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>

Entonces corre mvn process-sources

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

ruhsuzbaykus
fuente
1
maven-dependency-plugin (objetivos "copiar-dependencias", "descomprimir") no es compatible con m2e. :-(
PM
@Gobliins usa $ {project.build.directory} / lib en lugar de $ {targetdirectory}
Divyang Shah
24

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

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

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

Duncan Jones
fuente
¡Gracias! esta es la forma más fácil de copiar las bibliotecas que un proyecto requeriría en una carpeta en algún lugar para que pueda copiarlas en otro lugar si es necesario, por ejemplo, un proyecto no basado en Maven. Tenga en cuenta que, por supuesto, puede pasar en una carpeta codificada para usar si lo desea, por ejemplomvn dependency:copy-dependencies -DoutputDirectory=./lib
Brad Parks
¿Puedes hacerlo con pom.xml?
Gobliins
24

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>
adjablon
fuente
@Thomas Creo que es maven clean install, a continuación, se encuentra libentarget
Searene
1
¿Qué tendría que hacer para copiar solo 1 dependencia?
Alan Donizete
<classpathPrefix> lib / </classpathPrefix> me ayudó mucho. ¡Gracias!
Martin Pabst
Reemplazaría la installfase process-resourcespara que las dependencias se copien antes de que se buildejecute el objetivo
Vyacheslav Cotruta
20

Todo lo que necesitas es el siguiente fragmento dentro de pom.xml build/plugins:

<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 packagefase cuando ejecutes

mvn clean package

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

Si solo desea hacerlo ocasionalmente, no se requieren cambios en pom.xml. Simplemente ejecute 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
isapir
fuente
7

suponiendo que

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

Esto es lo que funcionó para mí:

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

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

La siguiente configuración generará scripts para Windows y Linux para iniciar la aplicación (con una ruta generada que hace referencia a todos los archivos jar de dependencias, descargue todas las dependencias (en una carpeta lib debajo de target / appassembler). El complemento de ensamblaje se puede usar para empaquetar todo appassembler directorio a un zip que se instala / implementa junto con el 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 directorio 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>
Vendedor rico
fuente
2

Si hace que su proyecto sea un war o ear type maven copiará las dependencias.

Eduard Wirch
fuente
1

Puede usar el Shade Plugin para crear un jar súper en el que puede agrupar todas sus dependencias de terceros.

Brian Matthews
fuente
1

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

(1) En el pom, en <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 ensamblado produjo el my-project-0.1-SNAPSHOT-jar-with-dependencies.jar deseado en el directorio de destino del proyecto.

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

OleVV
fuente
clase principal no encontrada en (3)
Thomas
1

Es una solución pesada para incrustar 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 debería necesitar 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>
Ruby Martes DONO
fuente
Su ejemplo de código no resuelve el problema, simplemente agrupa todo en un solo JAR. Sí, el complemento de ensamblaje se puede utilizar para lograr este objetivo, pero no así.
Duncan Jones
Aunque, en lecturas adicionales, tal vez estás respondiendo a este comentario .
Duncan Jones
ha pasado tanto tiempo que realmente no recuerdo ... además, me he oxidado bastante desde que me concentré en la administración de Linux en mi última empresa, ¡pero gracias por los comentarios!
RubyTuesdayDONO