Come posso convincere Maven a smettere di tentare di verificare la presenza di aggiornamenti per artefatti da un determinato gruppo da maven-central-repo?


126

Sto lavorando a un progetto Maven abbastanza grande. Probabilmente abbiamo circa 70 singoli artefatti, che sono approssimativamente divisi in due librerie di codice condiviso e forse dieci applicazioni che li usano. Tutti questi elementi vivono nello spazio dei nomi com.mycompany.*.

Il più delle volte ci imbattiamo in build di istantanee. Quindi, per fare una build completa di un'applicazione, potrei prima costruire i progetti di libreria in modo che siano installati nel mio repository locale (come, diciamo, mycompany-libname-2.4-SNAPSHOT.jar).

Il problema è che quando poi vado a costruire le applicazioni. Per qualche ragione, Maven vuole controllare i due principali repository pubblici (maven-net-repo e java-net-repo) per gli aggiornamenti di tutti i mycompany-*-SNAPSHOT.jarmanufatti. Naturalmente, non sono stati trovati lì e alla fine tutto si risolve con le versioni che ho appena creato nel mio repository locale, ma vorrei che Maven smettesse di farlo perché (a) mi fa sentire un cattivo net.citizen per controllare costantemente questi repository per cose che non ci saranno mai, e (b) aggiunge un po 'di latenza di rete non necessaria e fastidiosa nel mio processo di compilazione.

Ho iniziato a eseguire Maven in modalità offline per la maggior parte del tempo per ovviare a questo, ma non è l'ideale poiché a volte viene aggiornata una dipendenza da una biblioteca pubblica. Quindi quello che sto cercando è una soluzione che impedirà a Maven di non verificare la presenza di aggiornamenti da determinati repository per artefatti che soddisfano determinati criteri - in questo caso, sarei felice se Maven ignorerebbe le versioni SNAPSHOT o gli artefatti presenti lo com.mycompanyspazio dei nomi.

Risposte:


34

Il tag updatePolicy non ha funzionato per me. Tuttavia Rich Seller ha affermato che gli snapshot dovrebbero essere disabilitati comunque, quindi ho guardato oltre e ho notato che il repository aggiuntivo che ho aggiunto al mio settings.xml stava effettivamente causando il problema. L'aggiunta della sezione snapshot a questo repository nel mio settings.xml ha funzionato!

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

Grazie mille per la risposta. Alla fine mi ha aiutato. Ho riscontrato alcuni problemi con i download di istantanee per uno dei repository. I download erano sospesi anche con la polizia di aggiornamento mai. Ora le istantanee non vengono scaricate, il che è esattamente quello che volevo.
Wolfroma,

163

Inoltre, puoi usare -oo --offlinenella riga di comando mvn che metterà Maven in "modalità offline" in modo che non verifichi aggiornamenti. Riceverai alcuni avvisi sul fatto di non essere in grado di ottenere dipendenze non già nel tuo repository locale, ma non è un grosso problema.


8
Ciò impedirà a Mavven di scaricare anche le dipendenze rilasciate. Potresti desiderare una versione più recente della libreria rilasciata, senza che gli snapshot vengano controllati per l'aggiornamento
hobgoblin

2
Questa NON è CHIARAMENTE una risposta alla domanda originale! Come può avere così tanti voti ??? L'OP ha scritto esplicitamente che ha provato a eseguire Maven in modalità offline ma non è l'ideale per il suo scopo!
Honza Zidek,

95

Qualcosa che è ora disponibile anche in Maven

mvn goal --no-snapshot-updates

o in breve

mvn goal -nsu

3
Nel caso in cui qualcuno SBT atterrasse qui: set offline := truenella sessione o offline := truedentro build.sbt.
opyate

5
Inoltre, l' nsuopzione è rotta in v 3.0.3 (Vedi MNG-5064 ). Per utilizzare questa opzione in modo affidabile, potrebbe essere necessario eseguire l'aggiornamento ad almeno v. 3.0.4 o v. 3.0.5
Ashutosh Jindal

piuttosto il migliore
AntJavaDev

32

Aggiornamento: probabilmente avrei dovuto iniziare con questo dato che i tuoi progetti sono SNAPSHOT. Fa parte della semantica SNAPSHOT che Maven verificherà la presenza di aggiornamenti su ogni build. Essere un SNAPSHOT significa che è volatile e soggetto a modifiche, quindi è necessario verificare gli aggiornamenti. Tuttavia, vale la pena sottolineare che Maven super POM configura central per avere le istantanee disabilitate, quindi Maven non dovrebbe mai controllare gli aggiornamenti per SNAPSHOTs su central a meno che tu non l'abbia ignorato nelle tue pom / impostazioni.


Puoi configurare Maven per usare un mirror per il repository centrale, questo reindirizzerà tutte le richieste che normalmente passerebbero al repository interno.

Nel tuo settings.xml dovresti aggiungere qualcosa del genere per impostare il tuo repository interno come mirror per central:

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

Se stai usando un gestore di repository come Nexus per il tuo repository interno. È possibile impostare un repository proxy per proxy central, quindi eventuali richieste che normalmente andrebbero a Central vengono invece inviate al repository proxy (o a un gruppo di repository contenente il proxy) e le richieste successive vengono memorizzate nella cache del gestore repository interno. È anche possibile impostare il timeout della cache del proxy su -1, in modo che non richieda mai contenuti dalla centrale già presenti nel repository proxy.


Una soluzione più semplice se si lavora solo con repository locali è impostare updatePolicy per il repository centrale su "mai", ciò significa che Maven controllerà sempre e solo manufatti che non sono già nel repository locale. Questo può quindi essere sostituito dalla riga di comando quando necessario utilizzando l'opzione -U per forzare Maven a verificare la presenza di aggiornamenti.

Dovresti configurare il repository (nel tuo pom o un profilo in settings.xml) come segue:

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

In realtà abbiamo già un repository centrale, ma ovviamente non pubblichiamo build di snapshot su di esso, quindi presumibilmente avrei ancora controlli di aggiornamento falliti con il proxy / mirror in atto - Sto cercando un modo per ottenere Maven per non verificare affatto la presenza di aggiornamenti per questi artefatti.
Tim Gilbert,

1
Vale anche la pena impostare un repository logico sul repository centrale per i tuoi SNAPSHOT. Ciò significa che possono essere condivisi tra i tuoi sviluppatori e non tutti devi costruirli tutti a livello locale. Avrai quindi il pieno vantaggio di SNAPSHOT raccogliendo le modifiche a qualsiasi dipendenza SNAPSHOT non appena vengono inviate al repository remoto.
Rich Seller

Grazie - il flag updatePolicy sembra esattamente quello che stavo cercando.
Tim Gilbert,

1
Nexus ti consente anche di configurare le regole per impedire che eventuali richieste di artefatti dell'azienda diventino esterne.
Brian Fox,

Lo snippet XML qui non è più aggiornato. L' updatePolicyelemento passa sotto l' elemento snapshotso releases. Vedi: maven.apache.org/settings.html
Jeff Evans,

5

Molto semplice :

Nel tuo genitore Super POM o setting.xml, usa

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

Sono i miei consigli


0

Ho avuto qualche problema simile a questo,

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

L'impostazione di updatePolicy su "mai" non ha funzionato. La rimozione di questi repository è stata il modo in cui l'ho risolto. ps: stavo seguendo questo tutorial sui servizi web (a proposito, probabilmente il miglior tutorial per ws per java)


1
Stai usando Intellij? Perché Intellij + Maven = ignora updatePolicy. Vedi segnalazione bug youtrack.jetbrains.com/issue/IDEA-76869
Manav
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.