2011-02-28 11 views
6

Me falta algo. He buscado y buscado, y jugado y retoqué, y todavía no puedo entender cómo hacer lo siguiente con Maven:Maven: descargar artefacto y sus deps a un directorio específico

Me gustaría descargar un artefacto y todas sus dependencias (y dependencias transitivas), de nuestro servidor Nexus interno, en una ubicación especificada por el usuario. La idea aquí es permitir que la persona que está implementando la solución entre en producción de una manera que puedan obtener fácilmente todos los archivos jar que necesitan en un solo lugar.

Hay dependencia: get, y esto es close-but-no-cigar. Con la dependencia: get, todos los artefactos se descargan en el repositorio de mvn local, bajo los directorios de acuerdo con groupId y artifactId de cada artefacto. Esto NO es lo que quiero, porque entonces tienes que recorrer todos esos directorios para llegar a los frascos. Quiero que todos los archivos se descarguen a un directorio para que estén en un solo lugar.

Luego está la dependencia: copiar-dependencias. Esto nuevamente hace casi lo que quiero; copia todos los deps de un artefacto en destino/dependencia. Los dos problemas con esto son 1) Necesitas tener un pom.xml; no se pueden especificar coordenadas arbitrarias como se puede con la dependencia: get, y 2) dependency: copy-dependencies no se copia el artefacto principal en sí mismo en target/dependencias.

Debe haber una mejor manera de hacerlo, pero no puedo encontrar dónde buscar una solución. Para resumir, quiero poder darle a alguien un conjunto de coordenadas maven (groupId: artifactId: version) y nuestra URL Nexus interna, y hacer que descarguen todo con un comando en el directorio que elijan.

+0

¿Se puede hacer un proyecto que los use como dependencias, moverlos y crear su propio artefacto con esos frascos? – corsiKa

+0

Supongo que sí, pero eso no parece del todo bien. Debería haber una forma de descargar un artefacto y sus fragmentos directamente, ¿no? – Steven

+0

Estoy totalmente de acuerdo. No parece correcto. Y lo último que alguien quiere es "algo que funcione hasta que encontremos una mejor manera", porque estarás atrapado en el kludge para siempre. Pero si todo lo demás falla ... :) – corsiKa

Respuesta

0

Si "quieres darle a alguien un conjunto de coordenadas maven", sería mejor ponerlas en un pom.xml especial (tienes que escribirlas en cualquier lugar). Este pom no es el pomo de tu "artefacto principal", sino que tiene el "artefacto principal" como dependencia. El tipo de paquete puede ser pom ya que este proyecto no creará ningún artifcat.

Luego use la solución dependency:copy-dependencies que ya evaluó y obtendrá todas las dependencias que necesite. En mi humilde opinión, una solución elegante y simple. No sé nada mejor.

1

Utilice el complemento maven assembly para empaquetar un "jar adicional con dependencias" en un archivo ZIP que incluye todo.

http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 
    <!-- TODO: a jarjar format would be better --> 
    <id>jar-with-dependencies</id> 
    <formats> 
    <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <outputDirectory>/</outputDirectory> 
     <useProjectArtifact>true</useProjectArtifact> 
     <unpack>true</unpack> 
     <scope>runtime</scope> 
    </dependencySet> 
    </dependencySets> 
</assembly> 

A continuación, el usuario sólo puede solicitar <type>zip</type>, además de la habitual 'experta en coordenadas' para obtener un archivo zip con todas las dependencias.

+0

+1 - He utilizado el plugin de ensamblaje para empaquetar el JAR de mi proyecto con sus dependencias cuando necesitaba distribuir una aplicación de escritorio ejecutable; todos los JAR dependientes tenían que estar presentes en el classpath. Es muy fácil de configurar y tiene una gran documentación. –

Cuestiones relacionadas