Jak mogę sprawić, by Maven przestał próbować sprawdzać dostępność aktualizacji artefaktów z określonej grupy z maven-central-repo?

126

Pracuję nad dość dużym projektem Mavena. Mamy prawdopodobnie około 70 pojedynczych artefaktów, które są z grubsza podzielone na dwie biblioteki współdzielonego kodu i może dziesięć aplikacji, które ich używają. Wszystkie te elementy znajdują się w przestrzeni nazw com.mycompany.*.

Przez większość czasu korzystamy z kompilacji migawek. Tak więc, aby wykonać pełną kompilację aplikacji, mógłbym najpierw zbudować projekty bibliotek, aby zostały zainstalowane w moim lokalnym repozytorium (jak powiedzmy mycompany-libname-2.4-SNAPSHOT.jar).

Problem w tym, że kiedy zaczynam budować aplikacje. Z jakiegoś powodu Maven chce sprawdzić dwa główne repozytoria publiczne (maven-net-repo i java-net-repo) pod kątem aktualizacji wszystkich mycompany-*-SNAPSHOT.jarartefaktów. Oczywiście ich tam nie ma i wszystko w końcu wraca do wersji, które właśnie zbudowałem w moim lokalnym repozytorium, ale chciałbym, aby Maven przestał to robić, ponieważ (a) sprawia, że ​​czuję się jak zła sieć. Obywatel za ciągłe sprawdzanie tych repozytoriów pod kątem rzeczy, których nigdy tam nie będzie, oraz (b) dodaje niepotrzebne i irytujące opóźnienia sieciowe do mojego procesu kompilacji.

Przez większość czasu korzystałem z Mavena w trybie offline, aby obejść ten problem, ale nie jest to idealne rozwiązanie, ponieważ czasami zależność od biblioteki publicznej zostanie zaktualizowana. Poszukuję więc rozwiązania, które spowoduje, że Maven nie będzie sprawdzał aktualizacji z danych repozytoriów pod kątem artefaktów spełniających określone kryteria - w tym przypadku byłbym szczęśliwy, gdyby Maven zignorował wersje SNAPSHOT lub artefakty, które były w com.mycompanynazw.

Tim Gilbert
źródło

Odpowiedzi:

34

Tag updatePolicy nie działał dla mnie. Jednak Rich Seller wspomniał, że migawki i tak powinny być wyłączone, więc poszukałem dalej i zauważyłem, że dodatkowe repozytorium, które dodałem do mojego settings.xml, faktycznie powoduje problem. Dodanie sekcji migawek do tego repozytorium w moim settings.xml załatwiło sprawę!

<repository>
    <id>jboss</id>
    <name>JBoss Repository</name>
    <url>http://repository.jboss.com/maven2</url>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
</repository>
Dennis Lassing
źródło
Bardzo dziękuję za odpowiedź. Ostatecznie mi to pomogło. Miałem pewne problemy z pobieraniem migawek dla jednego z repozytoriów. Pobieranie zawieszało się, nawet gdy policja aktualizacji nigdy. Teraz migawki nie są pobierane, co jest dokładnie tym, czego chciałem.
wolfroma
163

Możesz także użyć -olub --offlinew wierszu poleceń mvn, co spowoduje przełączenie mavena w „tryb offline”, aby nie sprawdzał dostępności aktualizacji. Otrzymasz ostrzeżenie, że nie możesz pobrać zależności, które nie znajdują się jeszcze w lokalnym repozytorium, ale nic wielkiego.

Jeff Tsay
źródło
8
Powstrzyma to również mavena przed pobieraniem zwolnionych zależności. Możesz chcieć nowszej wersji wydanej biblioteki, bez sprawdzania aktualizacji migawek
hobgoblin
2
To WYRAŹNIE nie jest odpowiedzią na pierwotne pytanie! Jak to może mieć tyle pozytywnych głosów ??? OP wyraźnie napisał, że próbował uruchomić mavena w trybie offline, ale nie jest to idealne do jego celu!
Honza Zidek
95

Coś, co jest teraz dostępne również w Maven, jest

mvn goal --no-snapshot-updates

lub w skrócie

mvn goal -nsu
joostschouten
źródło
3
Na wypadek gdyby ktoś SBT wylądował tutaj: set offline := truew sesji lub offline := truew build.sbt.
opyate
5
Ponadto nsuopcja jest uszkodzona w wersji 3.0.3 (patrz MNG-5064 ). Aby niezawodnie korzystać z tej opcji, może być konieczna aktualizacja do co najmniej wersji 3.0.4 lub 3.0.5
Ashutosh Jindal
całkiem najlepszy
AntJavaDev
32

Aktualizacja: prawdopodobnie powinienem był zacząć od tego, ponieważ twoje projekty to SNAPSHOT. Jest to część semantyki SNAPSHOT, którą Maven będzie sprawdzać dostępność aktualizacji dla każdej kompilacji. Bycie SNAPSHOTem oznacza, że ​​jest niestabilny i podlega zmianom, dlatego należy sprawdzać aktualizacje. Warto jednak zauważyć, że Maven super POM konfiguruje centralę tak, aby mieć wyłączone migawki, więc Maven nie powinien nigdy sprawdzać aktualizacji dla SNAPSHOTów na centralnym, chyba że nadpisałeś to we własnym pom / ustawieniach.


Możesz skonfigurować Mavena do korzystania z serwera lustrzanego dla centralnego repozytorium, co spowoduje przekierowanie wszystkich żądań, które normalnie trafiłyby do centralnego, do twojego wewnętrznego repozytorium.

W pliku settings.xml można dodać coś takiego, aby ustawić swoje wewnętrzne repozytorium jako serwer lustrzany dla centralnego:

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

Jeśli używasz menedżera repozytorium, takiego jak Nexus, do wewnętrznego repozytorium. Możesz skonfigurować repozytorium proxy dla serwera proxy centralnego, tak aby wszelkie żądania, które normalnie trafiałyby do centralnego, są zamiast tego wysyłane do repozytorium proxy (lub grupy repozytoriów zawierającej proxy), a kolejne żądania są buforowane w wewnętrznym menedżerze repozytoriów. Możesz nawet ustawić limit czasu pamięci podręcznej proxy na -1, więc nigdy nie będzie żądał zawartości z centrali, która jest już w repozytorium proxy.


Bardziej podstawowym rozwiązaniem, jeśli pracujesz tylko z lokalnymi repozytoriami, jest ustawienie updatePolicy dla centralnego repozytorium na „nigdy”, co oznacza, że ​​Maven będzie sprawdzać tylko artefakty, których nie ma jeszcze w lokalnym repozytorium. W razie potrzeby można to zmienić w wierszu poleceń, używając przełącznika -U, aby zmusić Mavena do sprawdzania dostępności aktualizacji.

Skonfigurowałbyś repozytorium (w swoim pom lub profilu w settings.xml) w następujący sposób:

<repository>
  <id>central</id>
  <url>http://repo1.maven.org/maven2</url>
  <updatePolicy>never</updatePolicy>
</repository>
Bogaty sprzedawca
źródło
Właściwie mamy już centralne repozytorium, ale oczywiście nie publikujemy w nim kompilacji migawek, więc prawdopodobnie nadal otrzymywałbym nieudane testy aktualizacji z zainstalowanym serwerem proxy / serwerem lustrzanym - szukam sposobu na uzyskanie Mavena aby w ogóle nie sprawdzać aktualizacji tych artefaktów.
Tim Gilbert
1
Warto również ustawić logiczne repozytorium w swoim centralnym repozytorium dla SNAPSHOTów. Oznacza to, że mogą być współdzielone przez twoich programistów i nie wszyscy muszą tworzyć je wszystkie lokalnie. Będziesz wtedy w pełni korzystać z funkcji SNAPSHOT, pobierając zmiany we wszelkich zależnościach SNAPSHOT, gdy tylko zostaną one przesłane do zdalnego repozytorium.
Bogaty sprzedawca
Dzięki - flaga updatePolicy wygląda dokładnie tak, jak szukałem.
Tim Gilbert
1
Nexus umożliwia także konfigurowanie reguł, które uniemożliwiają wysyłanie artefaktów firmowych na zewnątrz.
Brian Fox
Ten fragment kodu XML jest teraz nieaktualny. updatePolicyElementem idzie pod snapshotslub releaseselementu. Zobacz: maven.apache.org/settings.html
Jeff Evans
5

Bardzo prosty :

W pliku nadrzędnym Super POM lub setting.xml użyj pliku

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

To moje wskazówki

Bruno Régnier
źródło
0

Miałem kłopoty podobne do tego,

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

Ustawienie updatePolicy na „nigdy” nie zadziałało. Usunięcie tego repozytorium było sposobem, w jaki to rozwiązałem. ps: Śledziłem ten samouczek dotyczący usług internetowych (przy okazji, prawdopodobnie najlepszy samouczek dla ws dla java)

spragniony
źródło
1
Czy używasz Intellij? Ponieważ Intellij + Maven = ignoruj ​​updatePolicy. Zobacz raport o błędzie youtrack.jetbrains.com/issue/IDEA-76869
Manav.