Jak mogę pobrać określony artefakt Mavena w jednym wierszu poleceń?

168

Mogę zainstalować artefakt przez install:install-file, ale jak mogę pobrać artefakt?

Na przykład:

mvn download:download-file -DgroupId=.. -DartifactId=.. -Dversion=LATEST
Xiè Jìléi
źródło
11
Pamiętaj, że wtyczka chce „repoUrl”, mimo że dokumentacja mówi „repositoryUrl”. To może doprowadzić cię do szaleństwa, tak jak mnie!
zakmck
Dokumentacja ( maven.apache.org/plugins/maven-dependency-plugin/get-mojo.html ) pokazuje zarówno parametry xml (<repositoryUrl> ... </repositoryUrl>), jak i właściwości użytkownika wiersza poleceń (mvn .. . -DrepoUrl = "..."). Ten konkretny przykład jest przestarzały, więc nie martw się; teraz jest teraz jednolicie zdalneRepozytoria (w obu zastosowaniach); ale pamiętaj, że parametr „destination” jest właściwością użytkownika „-Ddest = ...”; np. => 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 (wynik: ant-1.8.1.jar w bieżącym katalogu)
michael

Odpowiedzi:

182

Możesz użyć wtyczki zależności maven, która ma niezły dependency:getcel od wersji 2.1. Nie potrzebujesz pom, wszystko dzieje się w linii poleceń.

Aby upewnić się, że dependency:getcel został znaleziony , musisz wyraźnie powiedzieć mavenowi, aby używał wersji 2.1, tj. Musisz użyć w pełni kwalifikowanej nazwy wtyczki, w tym wersji:

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

AKTUALIZACJA: Ze starszymi wersjami Mavena (przed 2.1) możliwe jest dependency:getnormalne działanie (bez używania w pełni kwalifikowanej nazwy i wersji) poprzez wymuszenie na kopii mavena korzystania z danej wersji wtyczki.

Można to zrobić w następujący sposób:

1. Dodaj następujący wiersz w <settings>elemencie ~/.m2/settings.xmlpliku:

<usePluginRegistry>true</usePluginRegistry>

2. Dodaj plik ~/.m2/plugin-registry.xmlo następującej zawartości:

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

Ale to już nie działa z maven 2.1 / 2.2. W rzeczywistości, zgodnie z wprowadzeniem do rejestru wtyczek , funkcje wtyczkiplugin-registry.xml zostały przeprojektowane (w celu zapewnienia przenośności), a rejestr wtyczek jest obecnie w stanie półśpiącym w Maven 2 . Więc myślę, że na razie musimy użyć długiej nazwy (gdy używamy wtyczki bez pom, co jest pomysłem dependency:get).

Pascal Thivent
źródło
1
Tak, i właśnie otrzymałem tę samą rozdzielczość, używając zależności: zdobądź cel. Zależność mvn: get -Dartifact = org.apache.archiva: archiva-webapp: LATEST: war -DrepoUrl = repository.sonatype.org/content/repositories/central Jedyną niedogodnością jest to, że muszę podać opcję repoUrl. Twoje informacje naprawdę pomagają, używam mvn 2.2.1 (rdebian-1) i nie dotknąłem wtyczkiRegistry. Dzięki.
Xiè Jìléi
2
ten cel „get” wydaje się znowu „po prostu działać” (nie jest wymagana dodatkowa konfiguracja / hakowanie; wtyczka 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
Jaka jest różnica między get a install? Czy obaj nie przenoszą się do lokalnego repozytorium Maven? --edit: czekaj, nie, teraz rozumiem; install jest dla twojego lokalnego deps do skopiowania do lokalnego repozytorium m2, get pobiera je z pilota.
Chris2048,
4
znalazłem go, po prostu dołącz :jar:sourcesdo artefaktu , patrz stackoverflow.com/a/31109185/537554
ryenus
1
Z nowszymi wersjami Mavena (np. 3.6.0) nadal możesz to zrobić za pomocą justmvn dependency:get -Dartifact=group-id:artefact-id:version
scrutari.
93

Dzięki najnowszej wersji (2.8) wtyczki Maven Dependency , pobranie artefaktu z Maven Central Repository jest tak proste, jak:

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

gdzie groupId:artifactId:versionitd. są współrzędne Maven

Przykład przetestowany z Maven 2.0.9, Maven 2.2.1 i 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

(Dzięki Pascalowi Thiventowi za udzielenie wspaniałej odpowiedzi w pierwszej kolejności. Dodam kolejną odpowiedź, ponieważ nie zmieściłaby się w komentarzu i byłaby zbyt obszerna, aby ją edytować.)

Danilo Piazzalunga
źródło
Użyłem tego do pobrania archetypu mavena. Działa to świetnie, jeśli jesteś za proxy i pracujesz z eclipse, które nie rejestruje się w celu identyfikacji archtypów maven, mimo że skonfigurowałeś proxy w ustawieniach 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
Czy możesz wyjaśnić, co jar:sourcesoznacza / robi? dlaczego musisz określić „jar”? i czy „źródła” oznaczają, że pobierze dodatkowe zależności wymagane przez artefakt?
czerwony888
„jar” to rodzaj opakowania, „źródła” to klasyfikator. Biorąc pod uwagę jedną zależność (na przykład hibernate-core ), może istnieć więcej niż jeden artefakt. Często są to: 1. biblioteka tylko binarna, 2. sourcesplik JAR zawierający tylko źródła Java, 3. plik JAR zawierający tylko javadocdokumenty API. Zobacz też: Domyślne programy obsługi artefaktów Mavena .
Danilo Piazzalunga
Dziękuję za wyjaśnienie, jak [:classifier]poprawnie używać , jeśli mam utworzony przez wtyczkę assemlby plik zip, który chcę pobrać.
jonashackt
43

Oto, co zadziałało, gdy pobrałem najnowszą wersję artefaktu o nazwie „component.jar” wraz z Mavenem 3.1.1 (inne sugestie nie zadziałały, głównie z powodu zmian w wersji mavena)

To faktycznie pobiera plik i kopiuje go do lokalnego katalogu roboczego

Od basha:

mvn dependency:get \
    -DrepoUrl=http://.../ \
        -Dartifact=com.foo.something:component:LATEST:jar \
        -Dtransitive=false \
        -Ddest=component.jar \
verveguy
źródło
Wielkie dzięki! Nie potrzebowałem zdarzenia -DrepoUrl, myślę, że i tak wynikało to z mojego pom. Również nie używałem -Ddestjak ja faktycznie nie chce go ściągnąć do regularnego .m2katalogu.
yair
15
destParametr jest przestarzała i może być zastąpiony invokation dnia copypo gettak: mvn dependency:copy -Dartifact=com.foo.something:component:LATEST:jar -DoutputDirectory=.(w tym przypadku wprowadzania słoik w katalogu roboczym).
Jacob Raihle
@JacobRaihle Wtedy nie mogę pobrać plik bez pom.xml, otrzymuję następujący błąd: Goal requires a project to execute but there is no POM in this directory.
Athlan
2
Przypuszczam, że @Athlan No-pom support może być nowszą funkcją. Obecnie mogę po prostu biegać mvn dependency:copy(bez dependency:getwcześniejszego).
Jacob Raihle
26

Jeśli chodzi o to, jak uzyskać plik binarny artefaktu, odpowiedź Pascala Thiventa brzmi , ale aby uzyskać także słoik źródeł artefaktu, możemy użyć:

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

na przykład

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

To działa, ponieważ artifactparametr w rzeczywistości składa się z groupId:artifactId:version[:packaging][:classifier]. Tylko opakowanie i klasyfikator są opcjonalne.

Dzięki jarza opakowanie i sourcesjako klasyfikatora , wtyczki Maven zależność rozumie pytamy o słoiku źródeł nie słoiku artefakt.

Niestety na razie pliki jar źródeł nie mogą być pobierane przejściowo, co ma sens, ale uważam, że może również uwzględniać tę opcję, downloadSourcestak jak robi to wtyczka maven eclipse.

ryenus
źródło
17

Można by użyć zależności: copy ( http://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html ), która pobiera listę artefaktów zdefiniowanych w sekcji konfiguracyjnej wtyczki i kopiuje je do określonej lokalizacji , zmieniając ich nazwy lub usuwając wersję, jeśli to konieczne. Ten cel może rozwiązać problem artefaktów ze zdalnych repozytoriów, jeśli nie istnieją one ani w repozytorium lokalnym, ani w reaktorze.

Nie wszystkie właściwości wtyczki można było wykorzystać w maven CLI. Można określić właściwości, które mają zdefiniowaną właściwość „Właściwość użytkownika:”. W poniższym przykładzie pobieram junit do mojego folderu tymczasowego i usuwam wersję z pliku jar.

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

gdzie artifact = junit: junit: 4.11 to współrzędne maven. I określasz artifcat jako groupId: artifactId: wersja [: opakowanie [: klasyfikator]]

(W pierwszej kolejności podziękowania dla Pascala Thiventa za udostępnienie https://stackoverflow.com/a/18632876/2509415. Dodaję kolejną odpowiedź)

aloksahoo
źródło
11

jedna linijka do pobrania najnowszego artefaktu Mavena bez 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
źródło
3
Głosowano w dół. Wydaje się, że to rozwiązanie działa tylko z określonym produktem repozytorium.
Martín Straus
1
Działał świetnie z Nexusem 2.x, nie działa z 3.x (jeszcze)
HDave
curl: opcja -J jest nieznana
xuehui
2

Wykorzystanie z oficjalnej dokumentacji:

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

W moim przypadku zobacz odpowiedź poniżej:

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

Użyj polecenia „mvn dependency: get”, aby pobrać określony dokument i użyj polecenia „mvn dependency: copy”, aby skopiować pobrany artefakt do katalogu docelowego „-DoutputDirectory”

user2310670
źródło
1

Oto przykład, jak uzyskać ASM-7 za pomocą Maven 3.6:

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

Lub możesz pobrać słoik stąd: https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm, a następnie

mvn install:install-file -DgroupId=org.ow2.asm -DartifactId=asm -Dversion=7.0 -Dclassifier=sources -Dpackaging=jar -Dfile=/path/to/asm-7.0.jar
Cegła suszona na słońcu
źródło
0

Komenda:

mvn install:install-file 

Zazwyczaj instaluje artefakt w lokalnym repozytorium, więc nie powinieneś go pobierać. Jeśli jednak chcesz udostępnić swój artefakt innym, musisz wdrożyć artefakt w centralnym repozytorium, patrz wtyczka do wdrażania, aby uzyskać więcej informacji.

Dodatkowo dodanie zależności do POM spowoduje automatyczne pobranie wszelkich artefaktów innych firm, których potrzebujesz podczas tworzenia projektu. Tj. Spowoduje to pobranie artefaktu z centralnego repozytorium.

Clinton
źródło
0

LATEST jest przestarzały, spróbuj z zakresem [,)

./mvnw org.apache.maven.plugins:maven-dependency-plugin:3.1.1:get \  
-DremoteRepositories=repoId::default::https://nexus/repository/maven-releases/ \
"-Dartifact=com.acme:foo:[,)"
Mariusz S.
źródło