¿Cómo puedo descargar un artefacto Maven específico en una línea de comando?


168

Puedo instalar un artefacto install:install-file, pero ¿cómo puedo descargar un artefacto?

Por ejemplo:

mvn download:download-file -DgroupId=.. -DartifactId=.. -Dversion=LATEST

11
Tenga en cuenta que el complemento quiere 'repoUrl', a pesar de la documentación que dice 'repositoryUrl'. ¡Puede volverte loco como a mí!
zakmck

los documentos ( maven.apache.org/plugins/maven-dependency-plugin/get-mojo.html ) muestran parámetros xml (<repositoryUrl> ... </repositoryUrl>) y propiedades de usuario de la línea de comandos (mvn .. . -DrepoUrl = "..."). Este ejemplo en particular está en desuso, por lo que no se preocupe; ahora ahora es uniformemente RemoteRepositories (en ambos usos); pero tenga en cuenta que el parámetro "destino" es la propiedad del usuario "-Ddest = ..."; ej. => mvn org.apache.maven.plugins: maven-dependency-plugin: 2.5.1: get -DremoteRepositories = repo.maven.apache.org -Dartifact = org.apache.ant: ant: 1.8.1 -Ddest = ant-1.8.1.jar (resultado: ant-1.8.1.jar en el directorio actual)
michael

Respuestas:


182

Puede usar el complemento de dependencia de Maven que tiene un buen dependency:getobjetivo desde la versión 2.1. No es necesario un pom, todo sucede en la línea de comando.

Para asegurarse de encontrar el dependency:getobjetivo, debe decirle explícitamente a maven que use la versión 2.1, es decir, debe usar el nombre completo del complemento, incluida la versión:

mvn org.apache.maven.plugins:maven-dependency-plugin:2.1:get \
    -DrepoUrl=url \
    -Dartifact=groupId:artifactId:version

ACTUALIZACIÓN: con versiones anteriores de Maven (anteriores a 2.1), es posible ejecutar dependency:getnormalmente (sin usar el nombre y la versión totalmente calificados) forzando su copia de maven a usar una versión dada de un complemento.

Esto puede hacerse de la siguiente manera:

1. Agregue la siguiente línea dentro del <settings>elemento de su ~/.m2/settings.xmlarchivo:

<usePluginRegistry>true</usePluginRegistry>

2. Agregue el archivo ~/.m2/plugin-registry.xmlcon los siguientes contenidos:

<?xml version="1.0" encoding="UTF-8"?>
<pluginRegistry xsi:schemaLocation="http://maven.apache.org/PLUGIN_REGISTRY/1.0.0 http://maven.apache.org/xsd/plugin-registry-1.0.0.xsd"
xmlns="http://maven.apache.org/PLUGIN_REGISTRY/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <useVersion>2.1</useVersion>
      <rejectedVersions/>
    </plugin>
  </plugins>
</pluginRegistry>

Pero esto ya no parece funcionar con Maven 2.1 / 2.2. En realidad, de acuerdo con la Introducción al Registro de complementos , plugin-registry.xmlse han rediseñado las características del (para portabilidad) y el registro de complementos se encuentra actualmente en un estado semi inactivo dentro de Maven 2 . Así que creo que tenemos que usar el nombre largo por ahora (cuando se usa el complemento sin un pom, que es la idea detrás dependency:get).


1
Sí, y acabo de obtener la misma resolución usando dependencia: obtener objetivo. Dependencia mvn: get -Dartifact = org.apache.archiva: archiva-webapp: LATEST: war -DrepoUrl = repository.sonatype.org/content/repositories/central El único inconveniente es que debo proporcionar una opción de repoUrl. Su información realmente ayuda, estoy usando mvn 2.2.1 (rdebian-1) y no toqué el pluginRegistry. Gracias.
Xiè Jìléi

2
este objetivo de "obtener" parece "simplemente funcionar" nuevamente (no se requiere configuración / pirateo adicional; plugin 2.5.1, mvn 3.0.4): = ejemplo => mvn org.apache.maven.plugins: maven-dependency-plugin: 2.5.1: get -DremoteRepositories = repo.maven.apache.org -Dartifact = org.apache.ant: ant: 1.8.1 -Ddest = ant-1.8.1.jar
michael

¿Cuál es la diferencia entre obtener e instalar? ¿No van ambos a tu repositorio local de expertos? --editar: espera, no, lo entiendo ahora; la instalación es para que sus departamentos locales se copien en el repositorio local de m2, consígalos desde un control remoto.
Chris2048

44
lo encontré, solo agregue :jar:sourcesel artefacto , consulte stackoverflow.com/a/31109185/537554
ryenus

1
Con las versiones más recientes de Maven (por ejemplo, 3.6.0) todavía puede hacerlo con solomvn dependency:get -Dartifact=group-id:artefact-id:version
scrutari

93

Con la última versión (2.8) del Complemento de dependencia de Maven , descargar un artefacto del Repositorio central de Maven es tan simple como:

mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:get -Dartifact=groupId:artifactId:version[:packaging[:classifier]]

donde groupId:artifactId:version, etc. son las coordenadas Maven

Un ejemplo, probado con Maven 2.0.9, Maven 2.2.1 y Maven 3.0.4:

mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:get -Dartifact=org.hibernate:hibernate-entitymanager:3.4.0.GA:jar:sources

(Gracias a Pascal Thivent por proporcionar su maravillosa respuesta en primer lugar. Estoy agregando otra respuesta, porque no cabe en un comentario y sería demasiado extensa para una edición).


Usé esto para descargar el arquetipo de maven. Esto funciona muy bien si está detrás del proxy y trabaja con eclipse que no puede registrarse para identificar los arquetipos de Maven aunque haya configurado el proxy en la configuración xml.
Acewin

mvn org.apache.maven.plugins: maven-dependency-plugin: 2.8: get -Dartifact = org.apache.maven.archetypes: maven-archetype-webapp: 1.0: jar
Acewin

¿Puedes explicar qué jar:sourcessignifica / hace? ¿Por qué necesita especificar "jar"? y "fuentes" significa que descargará dependencias adicionales que requiere el artefacto?
red888

"jar" es el tipo de empaque, "sources" es el clasificador. Dada una dependencia (por ejemplo, hibernate-core ), podría haber más de un artefacto. A menudo, hay: 1. la biblioteca solo binaria, 2. sources, un archivo JAR que contiene solo fuentes Java, 3. javadoc, un archivo JAR con documentos API solamente. Consulte también: Controladores de artefactos predeterminados de Maven .
Danilo Piazzalunga

Gracias por aclarar cómo usar [:classifier]correctamente, si tengo un archivo zip de Assemlby plugin creado que quiero descargar.
jonashackt

43

Esto es lo que funcionó para mí para descargar la última versión de un artefacto llamado "component.jar" con Maven 3.1.1 al final (otras sugerencias no lo hicieron, principalmente debido a cambios en la versión de Maven, creo)

Esto realmente descarga el archivo y lo copia en el directorio de trabajo local

De bash:

mvn dependency:get \
    -DrepoUrl=http://.../ \
        -Dartifact=com.foo.something:component:LATEST:jar \
        -Dtransitive=false \
        -Ddest=component.jar \

¡Muchas gracias! No necesité el evento -DrepoUrl, supongo que estaba implícito en mi pom de todos modos. También yo no uso -Ddest, ya que en realidad hizo falta que se descarga a la normal .m2directorio.
yair

15
El destparámetro está en desuso y se puede reemplazar con una invocación de copydespués de esta getmanera: mvn dependency:copy -Dartifact=com.foo.something:component:LATEST:jar -DoutputDirectory=.(en este caso, colocar el jar en el directorio de trabajo).
Jacob Raihle

@JacobRaihle Entonces no puedo descargar el archivo sin pom.xml, consiguiendo el error siguiente: Goal requires a project to execute but there is no POM in this directory.
Athlan

2
El soporte de @Athlan No-pom puede ser una característica más nueva, supongo. Hoy en día solo puedo correr mvn dependency:copy(sin dependency:getprimero).
Jacob Raihle

26

Con respecto a cómo obtener el artefacto binario, la respuesta de Pascal Thivent es, pero también para obtener el jar de fuentes de artefactos, podemos usar:

mvn dependency:get -Dartifact=groupId:artifactId:version:jar:sources

p.ej

mvn dependency:get -Dartifact=junit:junit:4.12:jar:sources

Esto funciona porque el artifactparámetro en realidad consiste en groupId:artifactId:version[:packaging][:classifier]. Solo el embalaje y el clasificador son opcionales.

Con jarcomo embalaje ysources como clasificador , el plugin de dependencia experto entiende que estamos pidiendo el tarro de las fuentes, no el frasco artefacto.

Desafortunadamente, por ahora, los archivos jar de fuentes no se pueden descargar de forma transitiva, lo que tiene sentido, pero idealmente creo que también puede respetar la opción downloadSourcesal igual que lo hace el complemento eclipse de Maven.


17

Se podría usar la dependencia: copy ( http://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html ) que toma una lista de artefactos definidos en la sección de configuración del complemento y los copia en una ubicación específica , renombrándolos o quitando la versión si lo desea. Este objetivo puede resolver los artefactos de repositorios remotos si no existen en el repositorio local o en el reactor.

No todas las propiedades del complemento podrían usarse en la CLI de Maven. Se podrían especificar las propiedades que tienen la propiedad "Propiedad del usuario:" definida. En el siguiente ejemplo, estoy descargando junit a mi carpeta temporal y quitando la vesion del archivo jar.

mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:copy -Dartifact=junit:junit:4.11 -DoutputDirectory=/tmp -Dmdep.stripVersion=true

donde artefacto = junit: junit: 4.11 son las coordenadas de Maven. Y especifica artifcat como groupId: artifactId: version [: packaging [: clasificador]]

(Gracias a Pascal Thivent por proporcionar su https://stackoverflow.com/a/18632876/2509415 en primer lugar. Estoy agregando otra respuesta)


11

un trazador de líneas para descargar el último artefacto de maven sin mvn:

curl -O -J -L  "https://repository.sonatype.org/service/local/artifact/maven/content?r=central-proxy&g=io.staticcdn.sdk&a=staticcdn-sdk-standalone-optimizer&e=zip&v=LATEST"

3
Voto negativo Esta solución solo parece funcionar con un producto de repositorio específico.
Martín Straus

1
Funcionó muy bien con Nexus 2.x, no funciona con 3.x (todavía)
HDave

curl: opción -J es desconocida
xuehui

2

El uso de la documentación oficial:

https://maven.apache.org/plugins/maven-dependency-plugin/usage.html#dependency:get

Para mi caso, vea la respuesta a continuación:

mvn dependency:get -Dartifact=$2:$3:$4:$5 -DremoteRepositories=$1 -Dtransitive=false
mvn dependency:copy -Dartifact=$2:$3:$4:$5 -DremoteRepositories=$1 -Dtransitive=false -DoutputDirectory=$6

#mvn dependency:get -Dartifact=com.huya.mtp:hynswup:1.0.88-SNAPSHOT:jar -DremoteRepositories=http://nexus.google.com:8081/repository/maven-snapshots/ -Dtransitive=false
#mvn dependency:copy -Dartifact=com.huya.mtp:hynswup:1.0.88-SNAPSHOT:jar -DremoteRepositories=http://nexus.google.com:8081/repository/maven-snapshots/ -Dtransitive=false -DoutputDirectory=.

Use el comando "mvn dependency: get" para descargar un objeto específico y use el comando "mvn dependency: copy" para copiar el artefacto descargado en el directorio de destino "-DoutputDirectory"


1

Aquí hay un ejemplo para obtener ASM-7 usando Maven 3.6:

mvn dependency:get -DremoteRepositories=maven.apache.org -Dartifact=org.ow2.asm:7.0:sources:jar

O puede descargar el jar desde aquí: https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm y luego

mvn install:install-file -DgroupId=org.ow2.asm -DartifactId=asm -Dversion=7.0 -Dclassifier=sources -Dpackaging=jar -Dfile=/path/to/asm-7.0.jar

0

El comando:

mvn install:install-file 

Por lo general, instala el artefacto en su repositorio local, por lo que no debería necesitar descargarlo. Sin embargo, si desea compartir su artefacto con otras personas, deberá implementar el artefacto en un repositorio central. Vea el complemento de implementación para obtener más detalles.

Además, agregar una dependencia a su POM buscará automáticamente cualquier artefacto de terceros que necesite cuando cree su proyecto. Es decir, esto descargará el artefacto desde el repositorio central.


0

LATEST está en desuso, intente con rango [,)

./mvnw org.apache.maven.plugins:maven-dependency-plugin:3.1.1:get \  
-DremoteRepositories=repoId::default::https://nexus/repository/maven-releases/ \
"-Dartifact=com.acme:foo:[,)"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.