Come posso scaricare un artefatto Maven specifico in una riga di comando?


168

Posso installare un artefatto da install:install-file , ma come posso scaricare un artefatto?

Per esempio:

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

11
Attenzione che il plugin vuole "repoUrl", nonostante la documentazione che dice "repositoryUrl". Può farti impazzire come ha fatto per me!
zakmck,

the docs ( maven.apache.org/plugins/maven-dependency-plugin/get-mojo.html ) mostra sia i parametri xml (<repositoryUrl> ... </repositoryUrl>) che le proprietà utente della riga di comando (mvn .. . -DrepoUrl = "..."). Questo esempio particolare è deprecato, quindi non preoccuparti; ora è ora uniformemente Repository remoti (in entrambi gli usi); ma nota che il parametro "destinazione" è la proprietà dell'utente "-Ddest = ..."; eg => mvn org.apache.maven.plugins: plug-in maven-dependency: 2.5.1: get -DremoteRepositories = repo.maven.apache.org -Dartifact = org.apache.ant: ant: 1.8.1 -Ddest = ant-1.8.1.jar (risultato: ant-1.8.1.jar nella directory corrente)
michael

Risposte:


182

È possibile utilizzare il plug-in di dipendenza Maven che ha un buondependency:get obiettivo dalla versione 2.1. Non c'è bisogno di un pom, tutto accade dalla riga di comando.

Per essere sicuri di trovare l' dependency:getobiettivo, è necessario indicare esplicitamente a maven di utilizzare la versione 2.1, ovvero è necessario utilizzare il nome completo del plug-in, inclusa la versione:

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

AGGIORNAMENTO: con le versioni precedenti di Maven (precedenti alla 2.1), è possibile eseguiredependency:get normalmente (senza utilizzare il nome e la versione completi) forzando la propria copia di Maven a utilizzare una determinata versione di un plugin.

Questo può essere fatto come segue:

1. Aggiungi la seguente riga all'interno <settings>dell'elemento del tuo ~/.m2/settings.xmlfile:

<usePluginRegistry>true</usePluginRegistry>

2. Aggiungi il file ~/.m2/plugin-registry.xmlcon il seguente contenuto:

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

Ma questo non sembra funzionare più con Maven 2.1 / 2.2. In realtà, secondo l' Introduzione al Registro dei Plugin , le funzionalità di plugin-registry.xmlsono state riprogettate (per la portabilità) e il registro dei plugin è attualmente in uno stato semi-dormiente all'interno di Maven 2 . Quindi penso che dobbiamo usare il nome lungo per ora (quando si usa il plugin senza un pom, che è l'idea alla base dependency:get).


1
Sì, e ho appena ottenuto la stessa risoluzione usando la dipendenza: ottieni obiettivo. dipendenza mvn: get -Dartifact = org.apache.archiva: archiva-webapp: LATEST: war -DrepoUrl = repository.sonatype.org/content/repositories/central L'unico inconveniente è che devo fornire un'opzione repoUrl. Le tue informazioni sono di grande aiuto, sto usando mvn 2.2.1 (rdebian-1) e non ho toccato pluginRegistry. Grazie.
Xiè Jìléi,

2
questo obiettivo "get" sembra "funzionare nuovamente" (non sono necessarie ulteriori configurazioni / hacking; plug-in 2.5.1, mvn 3.0.4): = esempio => 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

Qual è la differenza tra get e install? Non vanno entrambi a prendere il tuo repo locale di Maven? --edit: aspetta, no, lo capisco ora; install è per i tuoi deps locali che devono essere copiati nel repository m2 locale, li recupera da un telecomando.
Chris2048,

4
trovato, basta aggiungere :jar:sourcesal manufatto , vedere stackoverflow.com/a/31109185/537554
ryenus

1
Con le versioni più recenti di Maven (ad es. 3.6.0) puoi ancora farlo con solomvn dependency:get -Dartifact=group-id:artefact-id:version
scrutari,

93

Con l'ultima versione (2.8) del plug-in di dipendenza Maven , scaricare un artefatto dal repository Maven Central è semplice come:

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

dove groupId:artifactId:version, ecc. sono le coordinate di Maven

Un esempio, testato con Maven 2.0.9, Maven 2.2.1 e 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

(Grazie a Pascal Thivent per aver fornito la sua meravigliosa risposta in primo luogo. Sto aggiungendo un'altra risposta, perché non si adatterebbe a un commento e sarebbe troppo estesa per una modifica.)


L'ho usato per scaricare l'archetipo di Maven. Funziona alla grande se si è dietro proxy e si lavora con eclipse che non si registra per identificare gli archtype maven anche se è stato configurato il proxy nelle impostazioni 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

Puoi spiegare cosa jar:sourcessignifica / fa? perché devi specificare "jar"? e "fonti" significa che scaricherà dipendenze aggiuntive richieste dal manufatto?
red888,

"jar" è il tipo di imballaggio, "fonti" è il classificatore. Data una dipendenza (ad esempio hibernate-core ), potrebbe esserci più di un artefatto. Spesso ci sono: 1. la libreria solo binaria, 2. sources, un file JAR contenente solo origini Java, 3. javadoc, un file JAR con solo documenti API. Vedi anche: Gestori di manufatti predefiniti Maven .
Danilo Piazzalunga,

Grazie per aver chiarito come utilizzare [:classifier]correttamente, se ho un plugin assemlby creato il file zip che voglio scaricare.
jonashackt,

43

Ecco cosa ha funzionato per me per scaricare l'ultima versione di un artefatto chiamato "component.jar" con Maven 3.1.1 alla fine (altri suggerimenti non hanno funzionato, principalmente a causa delle modifiche alla versione di Mven credo)

Questo effettivamente scarica il file e lo copia nella directory di lavoro locale

Da bash:

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

Grazie mille! Non avevo bisogno dell'evento -DrepoUrl, immagino fosse comunque implicito dal mio pom. Anche io non ho usato -Ddestcome ho effettivamente fatto voglia di esso scaricare al normale .m2directory.
yair

15
Il destparametro è obsoleto e può essere sostituito con un richiamo di copyafter in questo getmodo: mvn dependency:copy -Dartifact=com.foo.something:component:LATEST:jar -DoutputDirectory=.(in questo caso posizionando il jar nella directory di lavoro).
Jacob Raihle,

@JacobRaihle Allora non posso scaricare file senza pom.xml, ottenendo il seguente errore: Goal requires a project to execute but there is no POM in this directory.
Athlan,

2
@Athlan Il supporto No-pom potrebbe essere una novità, suppongo. Oggi posso solo correre mvn dependency:copy(senza dependency:getprima).
Jacob Raihle,

26

Per quanto riguarda come ottenere il binario del manufatto, la risposta di Pascal Thivent è, ma per ottenere anche il vaso delle fonti del manufatto, possiamo usare:

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

per esempio

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

Questo funziona perché il artifactparametro è effettivamente costituito da groupId:artifactId:version[:packaging][:classifier]. Solo l' imballaggio e il classificatore sono opzionali.

Con jarcome confezione e sourcescome classificatore , il plugin di dipendenza maven comprende che stiamo chiedendo il vaso dei sorgenti, non il vaso degli artefatti.

Sfortunatamente per ora i file jar di fonti non possono essere scaricati in modo transitorio, il che ha senso, ma idealmente credo che possa anche rispettare l'opzione downloadSourcesproprio come fa il plugin eclissi maven.


17

Si potrebbe usare la dipendenza: copy ( http://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html ) che prende un elenco di artefatti definiti nella sezione di configurazione del plugin e li copia in una posizione specificata , rinominandoli o rimuovendo la versione se lo si desidera. Questo obiettivo può risolvere gli artefatti dai repository remoti se non esistono nel repository locale o nel reattore.

Non tutte le proprietà del plugin potrebbero essere utilizzate nella CLI di Maven. È possibile specificare le proprietà con la proprietà "Proprietà utente:". Nell'esempio seguente sto scaricando junit nella mia cartella temp e rimuovendo la vesione dal file jar.

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

dove artefatto = junit: junit: 4.11 sono le coordinate di Maven. E specifichi artifcat come groupId: artifactId: version [: packaging [: classifier]]

(Grazie a Pascal Thivent per aver fornito il suo https://stackoverflow.com/a/18632876/2509415 in primo luogo. Sto aggiungendo un'altra risposta)


11

un liner per scaricare l'ultimo manufatto maven senza 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
Downvoted. Questa soluzione sembra funzionare solo con un prodotto repository specifico.
Martín Straus,

1
Ha funzionato alla grande con Nexus 2.x, non funziona con 3.x (ancora)
HDave il

ricciolo: l'opzione -J è sconosciuta
xuehui

2

L'utilizzo dalla documentazione ufficiale:

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

Per il mio caso, vedi la risposta qui sotto:

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

Utilizzare il comando "mvn dependency: get" per scaricare specifici aritfact e utilizzare il comando "mvn dependency: copy" per copiare l'artefatto scaricato in dir dir "-DoutputDirectory"


1

Ecco un esempio per ottenere ASM-7 usando Maven 3.6:

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

Oppure puoi scaricare il vaso da qui: https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm e quindi

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

Il comando:

mvn install:install-file 

In genere installa l'artefatto nel tuo repository locale, quindi non dovresti scaricarlo. Tuttavia, se desideri condividere il tuo artefatto con altri, dovrai distribuire l'artefatto in un repository centrale, vedi il plugin di distribuzione per maggiori dettagli.

Inoltre, l'aggiunta di una dipendenza al POM recupererà automaticamente tutti gli artefatti di terze parti necessari durante la creazione del progetto. Vale a dire questo scaricherà l'artefatto dal repository centrale.


0

LATEST è obsoleto, prova con intervallo [,)

./mvnw org.apache.maven.plugins:maven-dependency-plugin:3.1.1:get \  
-DremoteRepositories=repoId::default::https://nexus/repository/maven-releases/ \
"-Dartifact=com.acme:foo:[,)"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.