2008-09-18 20 views
205

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

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

+0

¿Por qué necesita esto? ¿Cuál es el tipo de proyecto de maven? jar? –

+0

El tipo de mi proyecto de maven es JAR. Lo necesito porque hay muchas dependencias y estoy intentando implementar el jar como un ejecutable. – Michael

+3

¿Estás utilizando ensamblajes? –

Respuesta

2

Si haces que tu proyecto sea war o ear, maven copiará las dependencias.

2

Puede usar el Shade Plugin para crear un jar de uber en el que pueda agrupar todas sus dependencias de terceros.

32

Eche un vistazo a Maven dependency plugin, específicamente, dependency:copy-dependencies goal. Eche un vistazo a the example bajo el encabezado La dependencia: copiar-dependencias mojo. Establezca la propiedad de configuración outputDirectory en $ {basedir}/target/lib (creo que deberá probar).

Espero que esto ayude.

+13

Alternativamente, podría usar $ {project.build.directory}/lib en lugar de $ {basedir}/target/lib – Cuga

73

El mejor enfoque depende de lo que desea hacer:

  • Si desea agrupar sus dependencias en un archivo WAR o EAR, a continuación, establezca simplemente el tipo de embalaje de su proyecto para 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, utilice el complemento assembly 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 tirar de las dependencias en el directorio de destino de forma interactiva, a continuación, utilizar el plugin dependency para copiar los archivos en.
  • Si desea para tirar en las dependencias de algún otro tipo de procesamiento, entonces es probable que Necesito generar tu propio plugin. Hay API para obtener la lista de dependencias y su ubicación en el disco. Tendrá que tomar desde allí ...
223

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> 
+9

Si desea que esto suceda todo el tiempo, elimine los contenedores ... y cree la etiqueta justo debajo de

+2

@Georgy esto no afecta a los archivos jar en lib /, pero incluye las clases en el proyecto compilado – Midhat

+4

Esto está bien, pero también está copiando dependencias de prueba. Me agrego la opción 'excludeScope' (http://maven.apache.org/plugins/maven-dependency-plugin/copy-dependencies-mojo.html). –

4

Si desea entregar un haz de tu frasco de aplicación, junto con todas sus dependencias y algunos scripts para invocar la clase principal, mira 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 de dependencia, descargue todas las dependencias (en una carpeta lib debajo de target/appassembler). El assembly plugin puede usarse para empaquetar el directorio appassembler conjunto a una cremallera que se instala/desplegado junto con el frasco 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 montaje (en src/main/montaje) para empaquetar el direcotry como una cremallera sería :

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

Solo para explicar lo que 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, bajo <construir> <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 de mvn compile el montaje: el montaje produjo la deseada mi-proyecto- 0.1-SNAPSHOT-jar-with-dependencies.jar en el directorio de destino del proyecto.

(3) me encontré con el frasco con java-jar mi-proyecto-0,1-INSTANTÁNEA-jar-con-dependencies.jar

+0

clase principal no encontrada en (3) – Thomas

28

Una solución simple y elegante para el caso donde se necesita copiar las dependencias a un directorio de destino sin utilizar ninguna otra fase de maven (me pareció muy útil cuando se trabaja con Vaadin).

completo ejemplo 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> 

A continuación, ejecute mvn process-sources

Las dependencias archivo JAR se pueden encontrar en /target/dependency

+1

maven-dependency-plugin (objetivos "copy-dependencies", "unpack") no es compatible con m2e. :-( –

+0

ejecuto casi el mismo código pero no copia nada – Gobliins

+0

@Gobliins usa $ {project.build.directory}/lib en lugar de $ {targetdirectory} –

1

Es una solución pesada para incrustar dependencias pesados, pero Maven de Assembly Plugin hace el truco para mi.

@Rich Seller's answer debería funcionar, aunque en los casos más simples, sólo necesitará este extracto de la usage guide:

<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> 
+0

Su ejemplo de código no resuelve el problema, simplemente empaqueta todo en un solo JAR. Sí, el complemento de ensamblaje se puede usar para lograr este objetivo, pero no así. –

+0

Aunque, en lecturas posteriores, tal vez esté respondiendo a [este comentario] (http://stackoverflow.com/questions/97640/ force-maven2-to-copy-dependencies-into-target-lib/25441276 # comment15792_97640). –

+0

ha pasado tanto tiempo que realmente no recuerdo ... además me he vuelto bastante oxidado desde que me centré en la administración de Linux en mi última firma - pero gracias por los comentarios! – RubyTuesdayDONO

21

intentar 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> 
+1

¿Cuál es el comando maven para ejecutar esto? – Thomas

+0

@Thomas Creo que es 'maven clean install', entonces encontrarás' lib' en 'target' – Searene

+0

¿qué tendría que hacer para copiar solo 1 dependencia? –

53
mvn install dependency:copy-dependencies 

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

19

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

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

Si se omite el last argument, las dependencias se colocan en target/dependencies.

+0

gracias! Esta es la forma más sencilla de copiar las bibliotecas que un proyecto requeriría en una carpeta en alguna parte para poder copiarlas en otro lugar si fuera necesario, p. ej. un proyecto no basado en maven. Tenga en cuenta que, por supuesto, puede pasar una carpeta codificada para usarla si lo desea, p. 'mvn dependency: copy-dependencies -DoutputDirectory =./lib ' –

+0

¿Se puede hacer desde pom.xml? – Gobliins

4

suponiendo

  • no desea alterar el pom.xml
  • no desea que la prueba de ámbito (por ejemplo junit.jar) o suministrado dependencias (por ejemplo wlfullclient.tarro)

aquí ist lo que funcionó para mí:

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

Todo lo que necesita es el siguiente fragmento en el interior 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 fase package cuando ejecuta

mvn clean package 

Y las dependencias se copiarán a outputDirectory especificado en el fragmento, es decir, lib en este caso.

Si solo desea hacer eso de vez en cuando, no se requieren cambios en pom.xml. Basta con ejecutar el siguiente:

mvn clean package dependency:copy-dependencies 

para anular la ubicación predeterminada, que es ${project.build.directory}/dependencies, añadir una propiedad del sistema llamado outputDirectory, es decir

-DoutputDirectory=${project.build.directory}/lib 
0
<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> 

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

Cuestiones relacionadas