Bagaimana saya bisa mengunduh artefak Maven tertentu dalam satu baris perintah?

168

Saya dapat menginstal artefak install:install-file, tetapi bagaimana cara mengunduh artefak?

Sebagai contoh:

mvn download:download-file -DgroupId=.. -DartifactId=.. -Dversion=LATEST
Xiè Jìléi
sumber
11
Berhati-hatilah karena plugin menginginkan 'repoUrl', meskipun ada dokumentasi yang mengatakan 'repositoryUrl'. Itu bisa membuatmu gila seperti yang terjadi padaku!
zakmck
docs ( maven.apache.org/plugins/maven-dependency-plugin/get-mojo.html ) memperlihatkan kedua xml params (<repositoryUrl> ... </repositoryUrl>) dan properti-pengguna baris perintah (mvn .. . -DrepoUrl = "..."). Contoh khusus ini sudah usang, jadi jangan khawatir; sekarang repositori remote seragam (dalam kedua penggunaan); tetapi perhatikan bahwa parameter "tujuan" adalah properti pengguna "-Ddest = ..."; misalnya => 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 (hasil: ant-1.8.1.jar di direktori saat ini)
michael

Jawaban:

182

Anda dapat menggunakan plugin ketergantungan maven yang memiliki dependency:gettujuan yang bagus sejak versi 2.1. Tidak perlu pom, semuanya terjadi di baris perintah.

Untuk memastikan untuk menemukan dependency:gettujuannya, Anda harus secara eksplisit memberi tahu pakar untuk menggunakan versi 2.1, yaitu Anda harus menggunakan nama plugin yang sepenuhnya memenuhi syarat, termasuk versi:

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

PEMBARUAN: Dengan versi Maven yang lebih lama (sebelum 2.1), dimungkinkan untuk berjalan secara dependency:getnormal (tanpa menggunakan nama dan versi yang sepenuhnya memenuhi syarat) dengan memaksa salinan pakar untuk menggunakan versi plugin yang diberikan.

Hal ini dapat dilakukan sebagai berikut:

1. Tambahkan baris berikut dalam <settings>elemen ~/.m2/settings.xmlfile Anda :

<usePluginRegistry>true</usePluginRegistry>

2. Tambahkan file ~/.m2/plugin-registry.xmldengan konten berikut:

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

Tapi ini tampaknya tidak berfungsi lagi dengan pakar 2.1 / 2.2. Sebenarnya, menurut Pengantar Registry Plugin , fitur-fitur plugin-registry.xmltelah dirancang ulang (untuk portabilitas) dan plugin plugin saat ini dalam keadaan semi-aktif dalam Maven 2 . Jadi saya pikir kita harus menggunakan nama panjang untuk saat ini (saat menggunakan plugin tanpa pom, yang merupakan ide di balik dependency:get).

Thivent Pascal
sumber
1
Ya, dan saya baru saja mendapatkan resolusi yang sama menggunakan dependency: get goal. mvn dependensi: get -Dartifact = org.apache.archiva: archiva-webapp: TERBARU: war -DrepoUrl = repository.sonatype.org/content/repositories/central Satu-satunya ketidaknyamanan adalah saya harus memberikan opsi repoUrl. Informasi Anda sangat membantu, saya menggunakan mvn 2.2.1 (rdebian-1) dan saya tidak menyentuh pluginRegistry. Terima kasih.
Xiè Jìléi
2
sasaran "dapatkan" ini tampaknya "hanya berfungsi" lagi (tidak diperlukan konfigurasi / peretasan tambahan; plugin 2.5.1, mvn 3.0.4): = example => mvn org.apache.maven.plugins: maven-dependency-plugin: 2.5.1: dapatkan -DremoteRepositories = repo.maven.apache.org -Dartifact = org.apache.ant: semut: 1.8.1 -Ddest = semut 1.8.1.jar
michael
Apa perbedaan antara mendapatkan dan menginstal? Bukankah mereka berdua mengambil repo pakar Anda? --edit: tunggu, tidak, saya mengerti sekarang; instal adalah untuk deps lokal Anda untuk disalin ke repo m2 lokal, dapatkan mengambilnya dari jarak jauh.
Chris2048
4
menemukannya, cukup tambahkan :jar:sourceske artefak , lihat stackoverflow.com/a/31109185/537554
ryenus
1
Dengan versi Maven yang lebih baru (mis. 3.6.0) Anda masih dapat melakukannya hanya denganmvn dependency:get -Dartifact=group-id:artefact-id:version
scrutari
93

Dengan versi terbaru (2.8) dari Plugin Maven Dependency , mengunduh artefak dari Maven Central Repository semudah:

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

di mana groupId:artifactId:version, dll. adalah koordinat Maven

Contoh, diuji dengan Maven 2.0.9, Maven 2.2.1, dan 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

(Terima kasih kepada Pascal Thivent karena memberikan jawaban yang luar biasa sejak awal. Saya menambahkan jawaban lain, karena itu tidak cocok dengan komentar dan terlalu luas untuk diedit.)

Danilo Piazzalunga
sumber
Saya menggunakan ini untuk mengunduh pola dasar maven. Ini berfungsi baik jika Anda berada di belakang proxy dan bekerja dengan gerhana yang gagal mendaftar untuk mengidentifikasi arketipe maven meskipun Anda telah mengkonfigurasi proxy di pengaturan 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
Bisakah Anda menjelaskan apa jar:sourcesartinya / tidak? mengapa Anda perlu menentukan "toples"? dan apakah "sumber" berarti itu akan mengunduh dependensi tambahan yang diperlukan artefak?
red888
"jar" adalah jenis kemasan, "sumber" adalah penggolongnya. Diberi satu ketergantungan (misalnya, hibernate-core ), mungkin ada lebih dari satu artefak. Seringkali, ada: 1. perpustakaan binary-only, 2. sources, file JAR yang hanya berisi sumber-sumber Java, 3. javadoc, file JAR dengan API docs saja. Lihat juga: Penangan Artefak Default Maven .
Danilo Piazzalunga
Terima kasih tentang memperjelas cara menggunakan yang [:classifier]benar, jika saya memiliki plugin lengkap yang dibuat file zip yang ingin saya unduh.
jonashackt
43

Inilah yang berhasil bagi saya untuk mengunduh versi terbaru dari sebuah artefak yang disebut "component.jar" dengan Maven 3.1.1 pada akhirnya (saran lain tidak, sebagian besar karena perubahan versi maven, saya percaya)

Ini sebenarnya mengunduh file dan menyalinnya ke direktori kerja lokal

Dari bash:

mvn dependency:get \
    -DrepoUrl=http://.../ \
        -Dartifact=com.foo.something:component:LATEST:jar \
        -Dtransitive=false \
        -Ddest=component.jar \
Verveguy
sumber
Terima kasih banyak! Saya tidak perlu acara -DrepoUrl, saya kira itu tersirat dari pom saya pula. Juga saya tidak menggunakan -Ddestseperti yang saya benar-benar melakukan keinginan untuk itu download ke biasa .m2direktori.
yair
15
The destparameter sudah ditinggalkan , dan bisa diganti dengan invokation dari copysetelah getseperti: mvn dependency:copy -Dartifact=com.foo.something:component:LATEST:jar -DoutputDirectory=.(dalam hal ini menempatkan tabung di direktori kerja).
Jacob Raihle
@JacobRaihle Lalu aku tidak bisa download file tanpa pom.xml, mendapatkan error berikut: Goal requires a project to execute but there is no POM in this directory.
Athlan
2
Dukungan @Athlan No-pom mungkin merupakan fitur yang lebih baru, saya kira. Saat ini saya hanya bisa menjalankan mvn dependency:copy(tanpa yang dependency:getpertama).
Jacob Raihle
26

Mengenai cara mendapatkan biner artefak, jawaban Pascal Thivent adalah itu, tetapi untuk juga mendapatkan tabung sumber artefak, kita dapat menggunakan:

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

misalnya

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

Ini berfungsi karena artifactparameter sebenarnya terdiri dari groupId:artifactId:version[:packaging][:classifier]. Hanya pengemasan dan penggolong adalah opsional.

Dengan jarsebagai pengemasan dan sourcessebagai penggolong , plugin dependensi pakar memahami bahwa kami meminta toples sumber, bukan toples artefak.

Sayangnya untuk saat ini sumber file jar tidak dapat diunduh secara transitif, yang memang masuk akal, tetapi idealnya saya percaya itu juga dapat menghargai opsi downloadSourcesseperti halnya plugin gerhana.

Ryenus
sumber
17

Seseorang dapat menggunakan dependensi: salin ( http://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html ) yang mengambil daftar artefak yang ditentukan di bagian konfigurasi plugin dan menyalinnya ke lokasi yang ditentukan , mengganti nama mereka atau menghapus versi jika diinginkan. Tujuan ini dapat menyelesaikan artefak dari repositori jarak jauh jika tidak ada di repositori lokal atau reaktor.

Tidak semua properti plugin dapat digunakan di maven CLI. Properti yang memiliki properti "Properti Pengguna:" yang ditentukan dapat ditentukan. Dalam contoh di bawah ini saya mengunduh junit ke folder temp saya dan menghapus vesion dari file jar.

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

di mana artifact = junit: junit: 4.11 adalah koordinat pakar. Dan Anda menentukan artifcat sebagai groupId: artifactId: version [: packaging [: classifier]]

(Terima kasih kepada Pascal Thivent untuk memberikan https://stackoverflow.com/a/18632876/2509415 di tempat pertama. Saya menambahkan jawaban lain)

aloksahoo
sumber
11

satu liner untuk mengunduh artefak maven terbaru tanpa 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
sumber
3
Diturunkan. Solusi ini tampaknya hanya berfungsi dengan produk repositori tertentu.
Martín Straus
1
Bekerja sangat baik dengan Nexus 2.x, tidak bekerja dengan 3.x (belum)
HDave
curl: option -J tidak diketahui
xuehui
2

Penggunaan dari dokumentasi resmi:

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

Untuk kasus saya, lihat jawabannya di bawah:

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

Gunakan perintah "mvn dependency: get" untuk mengunduh aritfact spesifik dan gunakan perintah "mvn dependency: copy" untuk menyalin artefak yang diunduh ke dest dir "-DoutputDirectory"

pengguna2310670
sumber
1

Berikut ini contoh untuk mendapatkan ASM-7 menggunakan Maven 3.6:

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

Atau Anda dapat mengunduh toples dari sini: https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm lalu

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

Perintah:

mvn install:install-file 

Biasanya menginstal artefak di repositori lokal Anda, jadi Anda tidak perlu mengunduhnya. Namun, jika Anda ingin membagikan artefak Anda dengan orang lain, Anda perlu menyebarkan artefak ke repositori pusat, lihat plugin deploy untuk lebih jelasnya.

Selain itu menambahkan ketergantungan pada POM Anda akan secara otomatis mengambil artefak pihak ketiga yang Anda butuhkan saat membangun proyek Anda. Yaitu Ini akan mengunduh artefak dari repositori pusat.

Clinton
sumber
0

LATEST sudah usang, coba dengan rentang [,)

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