Bagaimana saya bisa membuat Maven berhenti berusaha memeriksa pembaruan untuk artefak dari grup tertentu dari maven-central-repo?

126

Saya sedang mengerjakan proyek Maven yang cukup besar. Kami mungkin memiliki sekitar 70 atau lebih artefak individu, yang secara kasar dibagi menjadi dua pustaka kode bersama dan mungkin sepuluh aplikasi yang menggunakannya. Semua item ini tinggal di namespace com.mycompany.*.

Sebagian besar waktu kita berjalan melawan build snapshot. Jadi untuk melakukan pembangunan aplikasi secara penuh, saya mungkin membangun proyek perpustakaan terlebih dahulu sehingga mereka diinstal ke repositori lokal saya (seperti, katakanlah, mycompany-libname-2.4-SNAPSHOT.jar).

Masalahnya adalah ketika saya kemudian pergi membangun aplikasi. Untuk beberapa alasan, Maven ingin memeriksa dua repositori publik utama (maven-net-repo dan java-net-repo) untuk pembaruan untuk semua mycompany-*-SNAPSHOT.jarartefak. Tentu saja, mereka tidak ditemukan di sana, dan semuanya akhirnya kembali ke versi yang baru saja saya buat untuk repositori lokal saya, tetapi saya ingin Maven berhenti melakukan ini karena (a) itu membuat saya merasa seperti jaringan yang buruk. untuk terus-menerus memeriksa repositori ini untuk hal-hal yang tidak akan pernah ada, dan (b) menambahkan beberapa latensi jaringan yang tidak perlu dan mengganggu ke dalam proses pembangunan saya.

Saya telah mengambil menjalankan pakar dalam mode offline sebagian besar waktu untuk mengatasi ini, tapi itu tidak ideal karena kadang-kadang ketergantungan pada perpustakaan umum akan diperbarui. Jadi yang saya cari adalah solusi yang akan menyebabkan Maven tidak memeriksa pembaruan dari repositori yang diberikan untuk artefak yang memenuhi kriteria tertentu - dalam hal ini, saya akan senang jika Maven akan mengabaikan versi SNAPSHOT atau artefak yang ada di yang com.mycompanynamespace.

Tim Gilbert
sumber

Jawaban:

34

Tag updatePolicy tidak berfungsi untuk saya. Namun Rich Seller menyebutkan bahwa snapshot harus dinonaktifkan, jadi saya melihat lebih jauh dan memperhatikan bahwa repositori tambahan yang saya tambahkan ke pengaturan saya.xml sebenarnya menyebabkan masalah. Menambahkan bagian snapshots ke repositori ini di settings.xml saya berhasil!

<repository>
    <id>jboss</id>
    <name>JBoss Repository</name>
    <url>http://repository.jboss.com/maven2</url>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
</repository>
Dennis Lassing
sumber
Terima kasih banyak atas jawabannya. Akhirnya membantu saya. Saya mengalami beberapa masalah dengan unduhan snapshot untuk salah satu repositori. Unduhan tergantung bahkan dengan pembaruan polisi tidak pernah. Sekarang snapshot tidak diunduh yang persis seperti yang saya inginkan.
wolfroma
163

Juga, Anda dapat menggunakan -oatau --offlinedi baris perintah mvn yang akan membuat pakar dalam "mode offline" sehingga tidak akan memeriksa pembaruan. Anda akan mendapatkan peringatan tentang tidak bisa mendapatkan dependensi yang belum ada di repo lokal Anda, tetapi bukan masalah besar.

Jeff Tsay
sumber
8
Ini akan menghentikan pakar untuk mengunduh dependensi yang dirilis juga. Anda mungkin menginginkan versi terbaru dari perpustakaan yang dirilis, tanpa snapshot diperiksa untuk pembaruan
hobgoblin
2
Ini jelas bukan jawaban untuk pertanyaan awal! Bagaimana bisa ada begitu banyak upvotes ??? OP secara eksplisit menulis bahwa ia mencoba menjalankan pakar dalam mode offline tetapi tidak ideal untuk tujuannya!
Honza Zidek
95

Sesuatu yang sekarang tersedia di pakar juga

mvn goal --no-snapshot-updates

atau singkatnya

mvn goal -nsu
joostschouten
sumber
3
Untuk berjaga-jaga jika ada orang SBT mendarat di sini: set offline := truedi sesi, atau offline := truedi build.sbt.
Opyate
5
Selain itu, nsuopsi ini rusak di v 3.0.3 (Lihat MNG-5064 ). Untuk menggunakan opsi ini dengan andal, Anda mungkin perlu memutakhirkan ke atleast v. 3.0.4 atau v. 3.0.5
Ashutosh Jindal
cantik yang terbaik
AntJavaDev
32

Pembaruan: Seharusnya saya mulai dengan ini karena proyek Anda SNAPSHOT. Ini adalah bagian dari semantik SNAPSHOT yang akan diperiksa oleh Maven untuk setiap pembaruan. Menjadi SNAPSHOT berarti mudah berubah dan dapat berubah sehingga pembaruan harus diperiksa. Namun perlu ditunjukkan bahwa Maven super POM mengkonfigurasikan central agar snapshots dinonaktifkan, jadi Maven seharusnya tidak pernah memeriksa pembaruan untuk SNAPSHOT di pusat kecuali Anda telah menimpanya di pom / pengaturan Anda sendiri.


Anda bisa mengonfigurasi Maven untuk menggunakan mirror untuk repositori pusat, ini akan mengarahkan ulang semua permintaan yang biasanya pergi ke pusat ke repositori internal Anda.

Di settings.xml Anda, Anda akan menambahkan sesuatu seperti ini untuk mengatur repositori internal Anda sebagai mirror untuk pusat:

<mirrors>
  <mirror>
    <id>ibiblio.org</id>
    <name>ibiblio Mirror of http://repo1.maven.org/maven2/</name>
    <url>http://path/to/my/repository</url>
    <mirrorOf>central</mirrorOf>
  </mirror>
</mirrors>

Jika Anda menggunakan manajer repositori seperti Nexus untuk repositori internal Anda. Anda dapat mengatur repositori proxy untuk pusat proxy, jadi setiap permintaan yang biasanya pergi ke Central malah dikirim ke repositori proxy Anda (atau grup repositori yang berisi proxy), dan permintaan selanjutnya di-cache dalam manajer repositori internal. Anda bahkan dapat mengatur batas waktu cache proxy ke -1, sehingga tidak akan pernah meminta konten dari pusat yang sudah ada di repositori proxy.


Solusi yang lebih mendasar jika Anda hanya bekerja dengan repositori lokal adalah dengan mengatur updatePolicy untuk repositori pusat menjadi "tidak pernah", ini berarti Maven hanya akan pernah memeriksa artefak yang belum ada dalam repositori lokal. Ini kemudian dapat diganti pada baris perintah bila diperlukan dengan menggunakan -U untuk memaksa Maven memeriksa pembaruan.

Anda akan mengkonfigurasi repositori (di pom Anda atau profil di settings.xml) sebagai berikut:

<repository>
  <id>central</id>
  <url>http://repo1.maven.org/maven2</url>
  <updatePolicy>never</updatePolicy>
</repository>
Penjual Kaya
sumber
Kami sebenarnya sudah memiliki repositori pusat, tetapi tentu saja kami tidak mempublikasikan pembuatan snapshot untuk itu, jadi mungkin saya masih mendapatkan pembaruan pembaruan yang gagal dengan proxy / mirror di tempatnya - Saya mencari cara untuk mendapatkan Maven untuk tidak memeriksa pembaruan sama sekali untuk artefak ini.
Tim Gilbert
1
Layak juga menyiapkan repositori logis pada repositori pusat Anda untuk SNAPSHOT Anda. Ini berarti mereka dapat dibagi antara pengembang Anda dan Anda tidak harus membangun semuanya secara lokal. Anda kemudian akan mendapatkan manfaat penuh dari SNAPSHOT dengan mengambil perubahan pada setiap dependensi SNAPSHOT segera setelah mereka didorong ke repositori jarak jauh.
Penjual Kaya
Terima kasih - bendera updatePolicy terlihat persis seperti apa yang saya cari.
Tim Gilbert
1
Nexus juga memungkinkan Anda untuk mengonfigurasi aturan untuk mencegah permintaan artefak perusahaan menjadi eksternal.
Brian Fox
Cuplikan XML di sini sekarang kedaluwarsa. The updatePolicyelemen berjalan di bawah snapshotsatau releaseselemen. Lihat: maven.apache.org/settings.html
Jeff Evans
5

Sangat sederhana :

Di induk Super POM Anda atau setting.xml, gunakan

        <repository>
        <id>central</id>
        <releases>
            <updatePolicy>never</updatePolicy>
        </releases>
        <snapshots>
            <updatePolicy>never</updatePolicy>
        </snapshots>
        <url>http://repo1.maven.org/maven2</url>
        <layout>legacy</layout>
    </repository>

Ini tips saya

Bruno Régnier
sumber
0

Saya memiliki beberapa masalah yang mirip dengan ini,

<repository>
    <id>java.net</id>
    <url>https://maven-repository.dev.java.net/nonav/repository</url>
    <layout>legacy</layout>
</repository>
<repository>
    <id>java.net2</id>
    <url>https://maven2-repository.dev.java.net/nonav/repository</url>
</repository>

Mengatur pembaruanPolicy ke "tidak pernah" tidak berhasil. Menghapus repo ini adalah cara saya menyelesaikannya. ps: Saya mengikuti tutorial ini tentang layanan web (btw, mungkin tutorial terbaik untuk ws untuk java)

haus
sumber
1
Apakah Anda menggunakan Intellij? Karena Intellij + Maven = abaikan updatePolicy. Lihat laporan bug youtrack.jetbrains.com/issue/IDEA-76869
Manav