Maven'in maven-central-repo'daki belirli bir gruptan gelen eserlere yönelik güncellemeleri kontrol etme girişimini durdurmasını nasıl sağlayabilirim?


126

Oldukça büyük bir Maven projesi üzerinde çalışıyorum. Muhtemelen yaklaşık 70 ayrı yapımız var, bunlar kabaca iki paylaşılan kod kitaplığına ve belki de bunları kullanan on uygulamaya ayrılıyor. Bu öğelerin tümü ad alanında yaşar com.mycompany.*.

Çoğu zaman anlık görüntü yapılarına karşı koşuyoruz. Bu nedenle, bir uygulamanın tam derlemesini yapmak için, önce kütüphane projelerini yerel depoma yüklenecek şekilde oluşturabilirim (örneğin, mycompany-libname-2.4-SNAPSHOT.jar).

Sorun şu ki, o zaman uygulamaları oluşturmaya gittiğimde. Bazı nedenlerden dolayı Maven, tüm mycompany-*-SNAPSHOT.jareserlerin güncellemeleri için ana iki genel depoyu (maven-net-repo ve java-net-repo) kontrol etmek istiyor . Tabii ki, orada bulunmazlar ve her şey sonunda yerel depomda oluşturduğum sürümlere geri döner, ancak Maven'in bunu yapmayı bırakmasını isterim çünkü (a) bu beni kötü bir ağ gibi hissettiriyor. Citizen asla orada olmayacak şeyler için bu depoları sürekli kontrol etmek ve (b) oluşturma sürecime bazı gereksiz ve can sıkıcı ağ gecikmeleri ekler.

Bu sorunu çözmek için çoğu zaman çevrimdışı modda maven çalıştırmaya başladım, ancak bu ideal değil çünkü bazen bir halk kütüphanesine olan bağımlılık güncellenecek. Yani aradığım şey, Maven'in belirli kriterleri karşılayan eserler için belirli depolardan güncellemeleri kontrol etmemesine neden olacak bir çözüm - bu durumda Maven, SNAPSHOT sürümlerini veya içinde bulunan eserleri görmezden gelirse mutlu olurum. com.mycompanyad.

Yanıtlar:


34

UpdatePolicy etiketi benim için çalışmadı. Ancak Rich Seller, anlık görüntülerin yine de devre dışı bırakılması gerektiğini söyledi, bu yüzden daha fazla baktım ve settings.xml'ime eklediğim ekstra deponun aslında soruna neden olduğunu fark ettim. Ayarlar.xml dosyamdaki bu depoya anlık görüntüler bölümünü eklemek hile yaptı!

<repository>
    <id>jboss</id>
    <name>JBoss Repository</name>
    <url>http://repository.jboss.com/maven2</url>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
</repository>

Cevabınız için çok teşekkür ederim. Sonunda bana yardımcı oldu. Depolardan biri için anlık görüntü indirmeleriyle ilgili bazı sorunlar yaşıyordum. Güncelleme polisi ile bile indirmeler asılı değildi. Şimdi anlık görüntüler indirilmiyor ki bu tam olarak istediğim şey.
wolfroma

163

Ayrıca, maven'i "çevrimdışı moda" koyacak ve böylece güncellemeleri kontrol etmemesi için mvn komut satırından -oveya kullanabilirsiniz --offline. Henüz yerel deponuzda olmayan bağımlılıkları alamama konusunda bazı uyarılar alacaksınız, ancak önemli değil.


8
Bu, maven'in yayınlanan bağımlılıkları indirmesini de durduracaktır. Anlık görüntüler güncelleme için kontrol edilmeden yayınlanmış kütüphanenin daha yeni bir sürümünü isteyebilirsiniz
hobgoblin

2
Bu AÇIKÇA orijinal soruya bir cevap değil! Nasıl bu kadar çok olumlu oy alabilir ??? OP açıkça maven'i çevrimdışı modda çalıştırmayı denediğini yazdı, ancak bu onun amacı için ideal değil!
Honza Zidek

95

Şimdi maven'de de mevcut olan bir şey

mvn goal --no-snapshot-updates

veya kısaca

mvn goal -nsu

3
Her ihtimale karşı herhangi SBT millet burada karaya: set offline := trueoturumda veya offline := trueiçinde build.sbt.
opyate

5
Ayrıca nsuseçenek v 3.0.3'te bozulmuştur (Bkz. MNG-5064 ). Bu seçeneği güvenilir bir şekilde kullanmak için, en az v. 3.0.4 veya v. 3.0.5'e yükseltmeniz gerekebilir
Ashutosh Jindal

oldukça iyi
AntJavaDev

32

Güncelleme: Projeleriniz SNAPSHOT'lar olduğu için muhtemelen bununla başlamalıydım. Maven'in her derlemede güncellemeleri kontrol edeceği SNAPSHOT semantiğinin bir parçasıdır. Bir SNAPSHOT olmak, geçici olduğu ve değişebileceği anlamına gelir, bu nedenle güncellemelerin kontrol edilmesi gerekir. Bununla birlikte, Maven süper POM'un merkezi anlık görüntülerin devre dışı bırakılması için yapılandırdığına dikkat çekmeye değer , bu nedenle Maven, kendi pom / ayarlarınızda bunu geçersiz kılmadığınız sürece merkezdeki SNAPSHOT güncellemeleri kontrol etmemelidir.


Maven'i merkezi depo için bir yansıtma kullanacak şekilde yapılandırabilirsiniz , bu normalde merkeze giden tüm istekleri dahili deponuza yönlendirir.

Settings.xml dosyanıza, dahili deponuzu merkezi için ayna olarak ayarlamak için buna benzer bir şey ekleyebilirsiniz:

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

Dahili deponuz için Nexus gibi bir depo yöneticisi kullanıyorsanız . Proxy merkezi için bir vekil havuzu kurabilirsiniz , böylece normalde Merkeze gidecek olan tüm istekler bunun yerine vekil havuzunuza (veya vekili içeren depo grubuna ) gönderilir ve sonraki istekler dahili depo yöneticisinde önbelleğe alınır. Proxy önbellek zaman aşımını -1 olarak bile ayarlayabilirsiniz, böylece merkezden zaten proxy deposunda bulunan içerikleri hiçbir zaman istemez.


Yalnızca yerel depolarla çalışıyorsanız daha temel bir çözüm, updatePolicy'yi ayarlamaktır. , merkezi depo için "hiçbir zaman" her zaman kontrol edeceği anlamına gelir. Bu, daha sonra gerektiğinde Maven'i güncellemeleri kontrol etmeye zorlamak için -U anahtarı kullanılarak komut satırında geçersiz kılınabilir.

Havuzu (pom'unuzda veya settings.xml'deki bir profilde) aşağıdaki gibi yapılandırırsınız:

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

Aslında zaten bir merkezi depomuz var, ancak elbette anlık görüntü yapılarını yayınlamıyoruz, bu nedenle muhtemelen proxy / ayna yerinde olduğunda başarısız güncelleme kontrolleri alacağım - Maven'i almanın bir yolunu arıyorum bu eserler için güncellemeleri hiç kontrol etmemek.
Tim Gilbert

1
Ayrıca, SNAPSHOT'larınız için merkezi deponuzda mantıksal bir depo kurmaya değer. Bu, geliştiricileriniz arasında paylaşılabilecekleri ve hepsini yerel olarak oluşturmanız gerekmediği anlamına gelir. Daha sonra, herhangi bir SNAPSHOT bağımlılığındaki değişiklikleri uzak depoya gönderilir gönderilmez alarak SNAPSHOT'lardan tam olarak yararlanacaksınız.
Rich Seller

Teşekkürler - updatePolicy bayrağı tam olarak aradığım şeye benziyor.
Tim Gilbert

1
Nexus ayrıca, şirket yapılarının dışarı çıkmasına yönelik herhangi bir talebi önlemek için kurallar yapılandırmanıza da olanak tanır.
Brian Fox

Buradaki XML pasajı artık güncel değil. updatePolicyEleman altına gider snapshotsya da releaseselement. Bkz: maven.apache.org/settings.html
Jeff Evans

5

Çok basit :

Super POM parent veya setting.xml'nizde şunu kullanın:

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

Benim ipuçlarım


0

Buna benzer bir sorun yaşadım.

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

UpdatePolicy'nin "hiçbir zaman" olarak ayarlanması işe yaramadı. Bu depoyu kaldırmak, çözdüğüm yoldu. ps: Web hizmetleri hakkında bu öğreticiyi takip ediyordum (btw, muhtemelen java için ws için en iyi öğretici)


1
Intellij kullanıyor musunuz? Çünkü Intellij + Maven = updatePolicy'yi yoksay. Hata raporuna bakın youtrack.jetbrains.com/issue/IDEA-76869
Manav
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.