2009-08-28 6 views
102

Sto lavorando a un progetto Maven abbastanza grande. Probabilmente abbiamo circa 70 o più artefatti individuali, che sono divisi approssimativamente in due librerie di codice condiviso e forse dieci applicazioni che li usano. Tutti questi elementi vivono nello spazio dei nomi com.mycompany.*.Come posso convincere Maven a smettere di cercare gli aggiornamenti per gli artefatti di un certo gruppo da Maven-Central-Repo?

La maggior parte delle volte eseguiamo build snapshot. Quindi, per eseguire una compilazione completa di un'applicazione, potrei prima creare i progetti della libreria in modo che vengano installati nel mio repository locale (come, ad esempio, mycompany-libname-2.4-SNAPSHOT.jar).

Il problema è che quando passo a costruire le applicazioni. Per qualche ragione, Maven vuole verificare i due repository pubblici principali (maven-net-repo e java-net-repo) per gli aggiornamenti di tutti gli artefatti mycompany-*-SNAPSHOT.jar. Certo, non sono stati trovati lì e tutto alla fine si risolve nelle 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 saranno mai lì, e (b) aggiunge qualche inutile e fastidiosa latenza di rete nel mio processo di compilazione.

Ho utilizzato l'esecuzione di Maven in modalità offline per la maggior parte del tempo per ovviare a questo problema, ma non è l'ideale dato che occasionalmente viene aggiornata una dipendenza da una libreria pubblica. Quindi quello che sto cercando è una soluzione che farà sì che Maven non controlli gli aggiornamenti da repository dati per gli artefatti che soddisfano determinati criteri - in questo caso, sarei felice se Maven ignorasse le versioni SNAPSHOT o gli artefatti che erano in lo spazio dei nomi com.mycompany.

risposta

26

Il tag updatePolicy non ha funzionato per me. Tuttavia, Rich Seller ha detto che le snapshot dovrebbero essere disabilitate comunque, quindi ho guardato oltre e ho notato che il repository extra che ho aggiunto al mio settings.xml stava causando il problema. L'aggiunta della sezione snapshot a questo repository nel mio settings.xml ha fatto il trucco!

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

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, esattamente ciò che volevo. – wolfroma

29

Aggiornamento: avrei probabilmente dovuto iniziare con questo come i tuoi progetti sono SNAPSHOTs. Fa parte della semantica SNAPSHOT che Maven controllerà gli aggiornamenti su ogni build. Essere uno SNAPSHOT significa che è volatile e soggetto a modifiche, quindi è necessario controllare gli aggiornamenti. Tuttavia vale la pena notare che il Maven super POM configura la centrale in modo che le istantanee vengano disabilitate, quindi Maven non dovrebbe mai controllare gli aggiornamenti per SNAPSHOTs su centrale, a meno che non lo abbia sovrascritto nei propri pom/settings.


È possibile configurare Maven di utilizzare una mirror per il repository centrale, questo sarà reindirizzare tutte le richieste che normalmente andare a Central al repository interno.

Nella tua settings.xml si dovrebbe aggiungere qualcosa di simile per impostare il repository interno come da specchio per il centro:

<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 si utilizza un repository manager come Nexus per il repository interno. È possibile impostare uno proxy repository per il proxy centrale, quindi tutte le richieste che normalmente verrebbero trasferite a Central vengono invece inviate al repository proxy (o a repository group contenente il proxy) e le richieste successive vengono memorizzate nella cache nel gestore repository interno. È anche possibile impostare il timeout della cache del proxy su -1, quindi non richiederà mai i contenuti dalla centrale che si trovano già nel repository proxy.


Una soluzione più fondamentale se si lavora solo con i repository locali è quello di impostare la updatePolicy per il repository centrale per "mai", questo significa Maven sarà sempre e solo verificare la presenza di artefatti che non sono già in il repository locale. Questo può quindi essere sovrascritto sulla riga di comando, se necessario, utilizzando l'opzione -U per forzare Maven a verificare la presenza di aggiornamenti.

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

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

Noi in realtà hanno già un repository centrale, ma naturalmente non pubblichiamo build di snapshot, quindi presumibilmente continuerei a ricevere controlli di aggiornamento non riusciti con il proxy/mirror in atto: sto cercando un modo per convincere Maven a non controllare affatto gli aggiornamenti per questi artefatti. –

+1

Vale la pena anche impostare un repository logico sul tuo repository centrale per i tuoi SNAPSHOT. Ciò significa che possono essere condivisi tra i tuoi sviluppatori e non tutti devono costruirli tutti localmente. Otterrai quindi tutti i vantaggi di SNAPSHOT raccogliendo le modifiche a qualsiasi dipendenza SNAPSHOT non appena vengono trasferite al repository remoto. –

+0

Grazie - il flag updatePolicy sembra esattamente quello che stavo cercando. –

135

Inoltre, è possibile utilizzare -o o --offline nella riga di comando mvn che metterà Maven in "modalità offline" in modo da non controllare gli aggiornamenti. Avrai qualche avvertimento sul non essere in grado di ottenere le dipendenze non già nel tuo repository locale, ma non un grosso problema.

+6

Ciò impedirà a Maven di scaricare anche le dipendenze rilasciate. Potresti volere una versione più recente della libreria rilasciata, senza che le istantanee vengano controllate per l'aggiornamento – hobgoblin

+1

Questa non è CHIARAMENTE una risposta alla domanda originale! Come può avere così tanti upvotes ??? L'OP ha scritto esplicitamente che ha provato ad eseguire Maven in modalità offline ma non è l'ideale per il suo scopo! –

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> 

Impostazione del updatePolicy a "mai" non ha funzionato. Rimozione di questi pronti contro termine è stato il modo in cui ho risolto. ps: Stavo seguendo questo tutorial sui servizi Web (btw, probabilmente il miglior tutorial per ws per Java)

+1

Stai usando Intellij? Perché Intellij + Maven = ignora updatePolicy. Vedi bug report http://youtrack.jetbrains.com/issue/IDEA-76869 – Manav

75

qualcosa che è ora disponibile in Maven così è

mvn goal --no-snapshot-updates 

o in breve

mvn goal -nsu 
+2

Nel caso in cui qualcuno di SBT si trovi qui: '' set offline: = true''' nella sessione, o '' offline: = true''' in '' 'build.sbt'''. – opyate

+4

Inoltre, l'opzione 'nsu' è spezzata in v 3.0.3 (Vedi [** MNG-5064 **] (http://jira.codehaus.org/browse/MNG-5064)). Per utilizzare questa opzione in modo affidabile, potrebbe essere necessario aggiornare ad atleast v. 3.0.4 o v. 3.0.5 –

4

Molto semplice:

In un genitore Super POM o setting.xml, utilizzare

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

E 'miei consigli

Problemi correlati