2009-02-20 6 views
47

Estoy empezando a usar Maven, (realmente lo evalúo) y necesito poder generar rápidamente un archivo JAR para mi aplicación y un directorio con todas las dependencias (por ejemplo, lib) para poder implementar esos dos se ejecutarán de manera independiente. Generar el archivo JAR con el manifiesto adecuado es fácil, pero no sé cómo hacer que Maven copie las dependencias para el proyecto actual en un directorio lib que pueda implementar.¿Puede Maven recolectar todos los archivos JAR dependientes de un proyecto para ayudar con el despliegue de la aplicación?

Dado que se trata de una aplicación Java autónoma, soy no interesado en implementar en un repositorio Maven, que también es bastante trivial, o al menos fácilmente googleable.

He descubierto cómo hacer todo excepto copie los archivos JAR dependientes en algún directorio especificado. Este es el flujo de trabajo Busco:

$ mvn clean 
$ mvn package 
$ cp -r target/{lib,myApp.jar} installLocation 

Luego, corriendo myApp.jar de installLocation como un archivo JAR debe "sólo trabajo" a pesar de mi $CLASSPATH.

Para tratar de adelantarse algunas respuestas:

  • tengo una clase principal: conjunto, y funciona bien.
  • También configuré classpath en MANIFEST.MF, y eso funciona bien también.
  • He descubierto cómo usar <classpathPrefix> y <classpathMavenRepositoryLayout> para que esto funcione, pero solo en mi máquina. (vía: <classpathPrefix>${settings.localRepository}</classpathPrefix>)

Respuesta

73

Lo que quiere investigar es Maven's dependency plugin. Añadir algo similar a lo siguiente para pom.xml:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <configuration> 
     <outputDirectory> 
      ${project.build.directory} 
     </outputDirectory> 
    </configuration> 
</plugin> 

A continuación, ejecute mvn clean dependency:copy-dependencies copiar realizar la copia. Combine esto con el assembly plugin y puede empaquetar todo en un archivo independiente para su distribución.

+0

añadido esto a mi pom.xml dentro de Eclipse. No pasa nada –

+0

Tuve que descargar maven fuera del eclipse, agregué la carpeta/bin a mi ruta y luego ejecuté 'mvn dependency: copy-dependencies'. ¡SÍ! ¡Ahora funciona, Maven hace lo que se supone que debe hacer! Ahora solo es para copiar todo * .jar en mi proyecto y agregarlo a mi ruta de compilación –

3

Seguro que sí. Es necesario utilizar el shade plugin lo cual puede hacerse mediante la adición de

 <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>1.3-SNAPSHOT</version> 
     <configuration> 
      <!-- put your configurations here --> 
     </configuration> 
     </plugin> 

a su proyecto.

6

Sin embargo, otro uno es appassembler plugin
Lo que me gusta de ella es que los paquetes de la aplicación en una forma lista para su uso (con un archivo .bat ans) tales

7

no me importaba para el plugin desde la sombra enrolla todos los paquetes de todos los frascos.

Para incluir todas las libretas externas, puede usar el complemento de dependencia como se mencionó anteriormente.

Este ejemplo creará un directorio "lib" en "target/classes" antes de la fase "package".

 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>2.6</version> 
    <executions> 
    <execution> 
     <id>copy-dependencies</id> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
     <outputDirectory>target/classes/lib</outputDirectory> 
     <overWriteIfNewer>true</overWriteIfNewer> 
     <excludeGroupIds> 
      junit,org.hamcrest,org.mockito,org.powermock,${project.groupId} 
     </excludeGroupIds> 
     </configuration> 
    </execution> 
    <execution> 
     <phase>generate-sources</phase> 
     <goals> 
     <goal>sources</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <verbose>true</verbose> 
    <detail>true</detail> 
    <outputDirectory>${project.build.directory}</outputDirectory> 
    </configuration> 
</plugin> 
2

Eche un vistazo al complemento de dependencia de maven, específicamente el objetivo de copiar las dependencias. La sección de uso describe cómo hacer exactamente lo que desea.

Para hacerlo desde la línea de comandos acaba de hacer:

$ mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR 
-1

Usando maven.repo.local uno puede recoger todos los tarros, pero, que se recogen en un directorio con jerarquía experto (.m2) .

mvn install -Dmaven.repo.local=./pick/some/folder 

Luego, puede recogerlos (en Linux):

mkdir flat-repo 
find ./pick/some/folder -type f -name "*.jar" | xargs -I'{}' cp '{}' flat-repo/ 
Cuestiones relacionadas