Wie kann ich ein bestimmtes Maven-Artefakt in einer Befehlszeile herunterladen?

168

Ich kann ein Artefakt installieren install:install-file, aber wie kann ich ein Artefakt herunterladen?

Beispielsweise:

mvn download:download-file -DgroupId=.. -DartifactId=.. -Dversion=LATEST
Xiè Jìléi
quelle
11
Beachten Sie, dass das Plugin 'repoUrl' möchte, obwohl in der Dokumentation 'repositoryUrl' steht. Es kann dich verrückt machen, wie es mir angetan hat!
Zakmck
In den Dokumenten ( maven.apache.org/plugins/maven-dependency-plugin/get-mojo.html ) werden sowohl XML-Parameter (<repositoryUrl> ... </ repositoryUrl>) als auch Befehlszeilen-Benutzereigenschaften (mvn ..) angezeigt. . -DrepoUrl = "..."). Dieses spezielle Beispiel ist veraltet, also keine Sorge; jetzt ist es jetzt einheitlich remoteRepositories (in beiden Verwendungen); Beachten Sie jedoch, dass der Parameter "Ziel" die Benutzereigenschaft "-Ddest = ..." ist. zB => 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 (Ergebnis: ant-1.8.1.jar im aktuellen Verzeichnis)
Michael

Antworten:

182

Sie können das Maven-Abhängigkeits-Plugin verwenden, das dependency:getseit Version 2.1 ein gutes Ziel hat. Kein Pom erforderlich, alles geschieht über die Befehlszeile.

Um sicherzustellen, dass das dependency:getZiel gefunden wird, müssen Sie maven ausdrücklich anweisen, die Version 2.1 zu verwenden, dh Sie müssen den vollständig qualifizierten Namen des Plugins einschließlich der Version verwenden:

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

UPDATE: Mit älteren Versionen von Maven (vor 2.1) ist es möglich, dependency:getnormal zu laufen (ohne den vollständig qualifizierten Namen und die Version zu verwenden), indem Sie Ihre Kopie von Maven zwingen, eine bestimmte Version eines Plugins zu verwenden.

Dies kann wie folgt erfolgen:

1. Fügen Sie die folgende Zeile in das <settings>Element Ihrer ~/.m2/settings.xmlDatei ein:

<usePluginRegistry>true</usePluginRegistry>

2. Fügen Sie die Datei ~/.m2/plugin-registry.xmlmit folgendem Inhalt hinzu:

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

Dies scheint jedoch mit maven 2.1 / 2.2 nicht mehr zu funktionieren. Laut der Einführung in die Plugin-Registrierung wurden die Funktionen von plugin-registry.xml(aus Gründen der Portabilität) neu gestaltet, und die Plugin-Registrierung befindet sich derzeit in Maven 2 in einem halb ruhenden Zustand . Ich denke, wir müssen vorerst den langen Namen verwenden (wenn wir das Plugin ohne Pom verwenden, was die Idee dahinter ist dependency:get).

Pascal Thivent
quelle
1
Ja, und ich habe gerade die gleiche Auflösung mit Abhängigkeit: Ziel erreichen. mvn-Abhängigkeit: get -Dartifact = org.apache.archiva: archiva-webapp: LATEST: war -DrepoUrl = repository.sonatype.org/content/repositories/central Die einzige Unannehmlichkeit besteht darin, dass ich eine RepoUrl-Option bereitstellen muss. Ihre Informationen helfen wirklich, ich verwende mvn 2.2.1 (rdebian-1) und habe die pluginRegistry nicht berührt. Vielen Dank.
Xiè Jìléi
2
Dieses "get" -Ziel scheint wieder "nur zu funktionieren" (keine zusätzliche Konfiguration / Hacking erforderlich; 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
Was ist der Unterschied zwischen get und install? Holen sie nicht beide zu Ihrem lokalen Maven Repo? --edit: warte, nein, ich verstehe es jetzt; Bei der Installation werden Ihre lokalen Deps in das lokale m2-Repo kopiert und von einer Fernbedienung abgerufen.
Chris2048
4
gefunden, einfach :jar:sourcesan das Artefakt anhängen , siehe stackoverflow.com/a/31109185/537554
ryenus
1
Mit neueren Versionen von Maven (z. B. 3.6.0) können Sie dies immer noch mit justmvn dependency:get -Dartifact=group-id:artefact-id:version
examari
93

Mit der neuesten Version (2.8) des Maven Dependency Plugin ist das Herunterladen eines Artefakts aus dem Maven Central Repository so einfach wie:

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

wo groupId:artifactId:versionusw. sind die Maven-Koordinaten

Ein Beispiel, getestet mit Maven 2.0.9, Maven 2.2.1 und 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

(Vielen Dank an Pascal Thivent für seine wundervolle Antwort . Ich füge eine weitere Antwort hinzu, da sie nicht in einen Kommentar passt und für eine Bearbeitung zu umfangreich wäre.)

Danilo Piazzalunga
quelle
Ich habe dies verwendet, um den Maven-Archetyp herunterzuladen. Dies funktioniert hervorragend, wenn Sie sich hinter einem Proxy befinden und mit Eclipse arbeiten, das sich nicht registrieren lässt, um Maven-Archtypen zu identifizieren, obwohl Sie den Proxy in den XML-Einstellungen konfiguriert haben.
Acewin
mvn org.apache.maven.plugins: maven-dependency-plugin: 2.8: get -Dartifact = org.apache.maven.archetypes: maven-archetype-webapp: 1.0: jar
Acewin
Können Sie erklären, was jar:sourcesbedeutet / tut? Warum müssen Sie "jar" angeben? und bedeutet "Quellen", dass zusätzliche Abhängigkeiten heruntergeladen werden, die das Artefakt benötigt?
Red888
"jar" ist der Verpackungstyp, "sources" ist der Klassifikator. Bei einer Abhängigkeit (z. B. Hibernate-Core ) kann es mehr als ein Artefakt geben. Oft gibt es: 1. die Nur-Binär-Bibliothek, 2. sourceseine JAR-Datei, die nur Java-Quellen enthält, 3. eine JAR-Datei, die nur javadocAPI-Dokumente enthält. Siehe auch: Maven Default Artifact Handlers .
Danilo Piazzalunga
Vielen Dank für die Klarstellung, wie man die [:classifier]richtig verwendet, wenn ich ein Assemlby-Plugin erstellt habe, das ich herunterladen möchte.
Jonashackt
43

Hier ist, was für mich funktioniert hat, um am Ende die neueste Version eines Artefakts namens "component.jar" mit Maven 3.1.1 herunterzuladen (andere Vorschläge haben dies nicht getan, hauptsächlich aufgrund von Änderungen der Maven-Version, glaube ich).

Dadurch wird die Datei tatsächlich heruntergeladen und in das lokale Arbeitsverzeichnis kopiert

Von Bash:

mvn dependency:get \
    -DrepoUrl=http://.../ \
        -Dartifact=com.foo.something:component:LATEST:jar \
        -Dtransitive=false \
        -Ddest=component.jar \
verveguy
quelle
Vielen Dank! Ich brauchte das Event nicht -DrepoUrl, ich denke es wurde sowieso von meinem Pom impliziert. Auch habe ich nicht verwenden , -Ddestwie ich eigentlich tat will es zum normalen Download - .m2Verzeichnis.
yair
15
Der destParameter ist veraltet und kann durch einen Aufruf von copyafter getlike so ersetzt werden: mvn dependency:copy -Dartifact=com.foo.something:component:LATEST:jar -DoutputDirectory=.(in diesem Fall platzieren Sie das jar im Arbeitsverzeichnis).
Jacob Raihle
@JacobRaihle Dann kann ich keine Datei ohne pom.xml herunterladen, da der folgende Fehler auftritt : Goal requires a project to execute but there is no POM in this directory.
Athlan
2
@Athlan No-Pom-Unterstützung ist möglicherweise eine neuere Funktion, nehme ich an. Heutzutage kann ich einfach laufen mvn dependency:copy(ohne dependency:getvorher).
Jacob Raihle
26

In Bezug auf das Erhalten der Artefakt-Binärdatei lautet die Antwort von Pascal Thivent: Um jedoch auch das Glas mit den Artefaktquellen zu erhalten, können wir Folgendes verwenden:

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

z.B

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

Dies funktioniert, weil der artifactParameter tatsächlich aus besteht groupId:artifactId:version[:packaging][:classifier]. Nur die Verpackung und der Klassifikator sind optional.

Mit jarals Verpackung und sourcesals Klassifikator versteht das Maven-Abhängigkeits-Plugin, dass wir nach dem Quell-Jar fragen, nicht nach dem Artefakt-Jar.

Leider können JAR-Dateien für Quellen derzeit nicht transitiv heruntergeladen werden, was zwar sinnvoll ist, aber im Idealfall glaube ich, dass sie die Option downloadSourcesgenauso respektieren können wie das Maven Eclipse-Plugin.

Ryenus
quelle
17

Man könnte dependency: copy ( http://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html ) verwenden, das eine Liste der im Plugin-Konfigurationsabschnitt definierten Artefakte nimmt und sie an einen bestimmten Speicherort kopiert , benennen Sie sie um oder entfernen Sie die Version, falls gewünscht. Dieses Ziel kann die Artefakte aus Remote-Repositorys auflösen, wenn sie weder im lokalen Repository noch im Reaktor vorhanden sind.

Nicht alle Eigenschaften des Plugins konnten in der Maven-CLI verwendet werden. Die Eigenschaften, für die die Eigenschaft "Benutzereigenschaft:" definiert ist, können angegeben werden. Im folgenden Beispiel lade ich junit in meinen temporären Ordner herunter und entferne die Version aus der JAR-Datei.

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

Dabei ist Artefakt = Junit: Junit: 4.11 die Maven-Koordinaten. Und Sie geben artifcat als groupId :ifactId: version [: package [: classifier]] an.

(Vielen Dank an Pascal Thivent für die Bereitstellung seiner https://stackoverflow.com/a/18632876/2509415 . Ich füge eine weitere Antwort hinzu.)

Aloksahoo
quelle
11

Ein Liner zum Herunterladen des neuesten Maven-Artefakts ohne 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
quelle
3
Abgestimmt. Diese Lösung scheint nur mit einem bestimmten Repository-Produkt zu funktionieren.
Martín Straus
1
Funktionierte hervorragend mit Nexus 2.x, funktioniert (noch) nicht mit 3.x
HDave
Curl: Option -J ist unbekannt
Xuehui
2

Die Verwendung aus der offiziellen Dokumentation:

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

Für meinen Fall siehe die Antwort unten:

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

Verwenden Sie den Befehl "mvn dependency: get", um ein bestimmtes Artefakt herunterzuladen, und verwenden Sie den Befehl "mvn dependency: copy", um das heruntergeladene Artefakt in das Zielverzeichnis "-DoutputDirectory" zu kopieren.

user2310670
quelle
1

Hier ist ein Beispiel, um ASM-7 mit Maven 3.6 zu erhalten:

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

Oder Sie können das Glas hier herunterladen: https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm und dann

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

Der Befehl:

mvn install:install-file 

Typischerweise installiert das Artefakt in Ihrem lokalen Repository, so sollten Sie es nicht herunterladen. Wenn Sie Ihr Artefakt jedoch für andere freigeben möchten, müssen Sie das Artefakt in einem zentralen Repository bereitstellen. Weitere Informationen finden Sie im Bereitstellungs-Plugin .

Durch Hinzufügen einer Abhängigkeit zu Ihrem POM werden automatisch alle Artefakte von Drittanbietern abgerufen, die Sie beim Erstellen Ihres Projekts benötigen. Dies wird das Artefakt aus dem zentralen Repository herunterladen.

Clinton
quelle
0

LATEST ist veraltet, versuchen Sie es mit Reichweite [,)

./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
quelle