Comment puis-je télécharger un artefact Maven spécifique dans une ligne de commande?

168

Je peux installer un artefact par install:install-file, mais comment puis-je télécharger un artefact?

Par exemple:

mvn download:download-file -DgroupId=.. -DartifactId=.. -Dversion=LATEST
Xiè Jìléi
la source
11
Attention, le plugin veut 'repoUrl', malgré la documentation disant 'repositoryUrl'. Cela peut vous rendre fou comme pour moi!
zakmck
la documentation ( maven.apache.org/plugins/maven-dependency-plugin/get-mojo.html ) montre à la fois les paramètres xml (<repositoryUrl> ... </repositoryUrl>) et les propriétés utilisateur en ligne de commande (mvn .. . -DrepoUrl = "..."). Cet exemple particulier est obsolète, donc pas de soucis; maintenant il est maintenant uniformément remoteRepositories (dans les deux usages); mais notez que le paramètre "destination" est la propriété de l'utilisateur "-Ddest = ..."; par exemple => 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 (résultat: ant-1.8.1.jar dans le répertoire courant)
michael

Réponses:

182

Vous pouvez utiliser le plugin de dépendance maven qui a un bel dependency:getobjectif depuis la version 2.1. Pas besoin de pom, tout se passe sur la ligne de commande.

Pour être sûr de trouver l' dependency:getobjectif, vous devez explicitement dire à maven d'utiliser la version 2.1, c'est-à-dire que vous devez utiliser le nom complet du plugin, y compris la version:

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

MISE À JOUR: Avec les anciennes versions de Maven (antérieures à 2.1), il est possible de s'exécuter dependency:getnormalement (sans utiliser le nom et la version complets) en forçant votre copie de maven à utiliser une version donnée d'un plugin.

Cela peut être fait comme suit:

1. Ajoutez la ligne suivante dans l' <settings>élément de votre ~/.m2/settings.xmlfichier:

<usePluginRegistry>true</usePluginRegistry>

2. Ajoutez le fichier ~/.m2/plugin-registry.xmlavec le contenu suivant:

<?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>

Mais cela ne semble plus fonctionner avec maven 2.1 / 2.2. En fait, selon l' introduction au registre des plugins , les fonctionnalités du plugin-registry.xmlont été repensées (pour la portabilité) et le registre des plugins est actuellement dans un état semi-dormant dans Maven 2 . Je pense donc que nous devons utiliser le nom long pour le moment (lorsque vous utilisez le plugin sans pom, ce qui est l'idée derrière dependency:get).

Pascal Thivent
la source
1
Oui, et j'ai juste la même résolution en utilisant la dépendance: obtenir un objectif. mvn dependency: get -Dartifact = org.apache.archiva: archiva-webapp: LATEST: war -DrepoUrl = repository.sonatype.org/content/repositories/central Le seul inconvénient est que je dois fournir une option repoUrl. Vos informations sont vraiment utiles, j'utilise mvn 2.2.1 (rdebian-1) et je n'ai pas touché au pluginRegistry. Merci.
Xiè Jìléi
2
cet objectif "get" semble "juste fonctionner" à nouveau (aucune configuration / piratage supplémentaire requis; plugin 2.5.1, mvn 3.0.4): = example => 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
Quelle est la différence entre obtenir et installer? Ne vont-ils pas tous les deux aller à votre repo local Maven? --edit: attendez, non, je comprends maintenant; install est pour que vos deps locaux soient copiés dans le repo m2 local, récupérez-les à partir d'une télécommande.
Chris2048
4
trouvé, ajoutez simplement :jar:sourcesà l' artefact , voir stackoverflow.com/a/31109185/537554
ryenus
1
Avec les versions plus récentes de Maven (par exemple 3.6.0), vous pouvez toujours le faire avec justemvn dependency:get -Dartifact=group-id:artefact-id:version
scrutari
93

Avec la dernière version (2.8) du plugin de dépendance Maven , télécharger un artefact depuis le référentiel central Maven est aussi simple que:

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

groupId:artifactId:version, etc. sont les coordonnées Maven

Un exemple, testé avec Maven 2.0.9, Maven 2.2.1 et 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

(Merci à Pascal Thivent d'avoir fourni sa merveilleuse réponse en premier lieu. J'ajoute une autre réponse, car elle ne rentrerait pas dans un commentaire et serait trop longue pour une modification.)

Danilo Piazzalunga
la source
Je l'ai utilisé pour télécharger l'archétype maven. Cela fonctionne très bien si vous êtes derrière un proxy et que vous travaillez avec eclipse qui ne parvient pas à s'enregistrer pour identifier les archtypes maven même si vous avez configuré le proxy dans les paramètres xml.
Acewin le
mvn org.apache.maven.plugins: maven-dependency-plugin: 2.8: get -Dartifact = org.apache.maven.archetypes: maven-archetype-webapp: 1.0: jar
Acewin
Pouvez-vous expliquer ce que jar:sourcessignifie / fait? pourquoi avez-vous besoin de spécifier "jar"? et est-ce que «sources» signifie qu'il téléchargera des dépendances supplémentaires dont l'artefact a besoin?
red888
"jar" est le type d'emballage, "sources" est le classificateur. Étant donné une dépendance (par exemple, hibernate-core ), il peut y avoir plus d'un artefact. Souvent, il y a: 1. la bibliothèque binaire uniquement, 2. sources, un fichier JAR contenant uniquement des sources Java, 3. javadoc, un fichier JAR avec des documents API uniquement. Voir aussi: Gestionnaires d'artefacts par défaut Maven .
Danilo Piazzalunga
Merci de clarifier comment utiliser le [:classifier]correctement, si j'ai un fichier zip créé par un plugin assemlby que je veux télécharger.
jonashackt le
43

Voici ce qui a fonctionné pour moi pour télécharger la dernière version d'un artefact appelé "component.jar" avec Maven 3.1.1 à la fin (d'autres suggestions n'ont pas fonctionné, principalement en raison des changements de version de maven, je crois)

Cela télécharge le fichier et le copie dans le répertoire de travail local

De bash:

mvn dependency:get \
    -DrepoUrl=http://.../ \
        -Dartifact=com.foo.something:component:LATEST:jar \
        -Dtransitive=false \
        -Ddest=component.jar \
verveguy
la source
Grand merci! Je n'ai pas eu besoin de l'événement -DrepoUrl, je suppose que c'était implicite de toute façon de mon pom. Aussi je n'ai pas utilisé -Ddestcomme je l' ai fait fait défaut à ce télécharger le régulier .m2répertoire.
yair
15
Le destparamètre est obsolète , et peut être remplacé par une invocation de copyafter getcomme ceci: mvn dependency:copy -Dartifact=com.foo.something:component:LATEST:jar -DoutputDirectory=.(dans ce cas, placer le fichier jar dans le répertoire de travail).
Jacob Raihle
@JacobRaihle Je ne peux alors pas télécharger le fichier sans pom.xml, obtenir l'erreur suivante: Goal requires a project to execute but there is no POM in this directory.
Athlan
2
Le support @Athlan No-pom est peut-être une fonctionnalité plus récente, je suppose. De nos jours, je peux simplement courir mvn dependency:copy(sans d' dependency:getabord).
Jacob Raihle
26

Concernant la façon d'obtenir le binaire de l'artefact, la réponse de Pascal Thivent est la suivante, mais pour obtenir également le jar des sources d'artefact, nous pouvons utiliser:

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

par exemple

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

Cela fonctionne car le artifactparamètre se compose en fait de groupId:artifactId:version[:packaging][:classifier]. Seuls l' emballage et le classificateur sont facultatifs.

Avec jarcomme empaquetage et sourcescomme classificateur , le plugin de dépendance maven comprend que nous demandons le jar des sources, pas le jar de l'artefact.

Malheureusement pour le moment, les fichiers jar sources ne peuvent pas être téléchargés de manière transitoire, ce qui est logique, mais idéalement, je pense qu'il peut également respecter l'option, downloadSourcestout comme le fait le plugin maven eclipse.

Ryenus
la source
17

On pourrait utiliser dependency: copy ( http://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html ) qui prend une liste d'artefacts définis dans la section de configuration du plugin et les copie dans un emplacement spécifié , en les renommant ou en supprimant la version si vous le souhaitez. Cet objectif peut résoudre les artefacts des référentiels distants s'ils n'existent ni dans le référentiel local ni dans le réacteur.

Toutes les propriétés du plugin ne peuvent pas être utilisées dans maven CLI. Les propriétés dont la propriété "Propriété utilisateur:" est définie peuvent être spécifiées. Dans l'exemple ci-dessous, je télécharge junit dans mon dossier temporaire et supprime la vesion du fichier jar.

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

où artifact = junit: junit: 4.11 est les coordonnées maven. Et vous spécifiez artifcat comme groupId: artifactId: version [: packaging [: classifier]]

(Merci à Pascal Thivent d'avoir fourni son https://stackoverflow.com/a/18632876/2509415 en premier lieu. J'ajoute une autre réponse)

aloksahoo
la source
11

une doublure pour télécharger le dernier artefact maven sans 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"
mrduguo
la source
3
Voté contre. Cette solution ne semble fonctionner qu'avec un produit de référentiel spécifique.
Martín Straus
1
Fonctionne très bien avec Nexus 2.x, ne fonctionne pas avec 3.x (encore)
HDave
curl: option -J is unknown
xuehui
2

L'utilisation de la documentation officielle:

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

Pour mon cas, voir la réponse ci-dessous:

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=.

Utilisez la commande "mvn dependency: get" pour télécharger un aritfact spécifique et utilisez la commande "mvn dependency: copy" pour copier l'artefact téléchargé dans le répertoire dest "-DoutputDirectory"

utilisateur2310670
la source
1

Voici un exemple pour obtenir ASM-7 en utilisant Maven 3.6:

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

Ou vous pouvez télécharger le fichier à partir d'ici: https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm puis

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

La commande:

mvn install:install-file 

En règle générale installe l'artefact dans votre dépôt local, de sorte que vous ne devriez pas avoir à le télécharger. Cependant, si vous souhaitez partager votre artefact avec d'autres, vous devrez déployer l'artefact dans un référentiel central, voir le plugin de déploiement pour plus de détails.

De plus, l'ajout d'une dépendance à votre POM récupérera automatiquement tous les artefacts tiers dont vous avez besoin lorsque vous générez votre projet. Ie Cela téléchargera l'artefact depuis le référentiel central.

Clinton
la source
0

LATEST est obsolète, essayez avec la plage [,)

./mvnw org.apache.maven.plugins:maven-dependency-plugin:3.1.1:get \  
-DremoteRepositories=repoId::default::https://nexus/repository/maven-releases/ \
"-Dartifact=com.acme:foo:[,)"
MariuszS
la source