2011-08-26 9 views
18

Abbiamo un progetto Maven multi-modulo di grandi dimensioni. Con l'obiettivo di aumentare la produttività dello sviluppo, di recente abbiamo iniziato a distribuire istantanee su un repository remoto (tramite build centrale) e abbiamo introdotto i profili maven, il che significa che gli utenti devono solo controllare e creare un sottoinsieme di moduli e scattare istantanee per il resto. Abbiamo anche impostato la nostra politica di aggiornamento sugli archivi remoti su "mai", per garantire che sia esplicita quando vogliamo aggiornare le istantanee locali. Un tipico comando è quindi; mvn -Pref -U installazione pulita.Consenti istantanee create localmente per ignorare istantanee remote più recenti

Ora, nel reattore di esperti, la compilazione per i moduli definiti nel profilo funziona perfettamente, utilizzando le istantanee per le loro dipendenze, incluso il download di quelli aggiornati dal repository remoto (nota importante, per assicurarsi di avere un set coerente di istantanee, la nostra distribuzione centrale è di tutte le istantanee del modulo del nostro progetto, anche se solo un paio di esse sono state modificate).

L'attacco sembra essere quando Maven sta quindi risolvendo le dipendenze su quei moduli creati localmente da moduli che esistono al di fuori del profilo - se uno snapshot è stato distribuito in remoto dalla creazione di tale modulo, allora Maven lo vede come un versione più aggiornata e procede al download e sovrascrivere lo snapshot creato localmente. Ciò può causare interruzioni in cui altri moduli si aspettano il modulo modificato localmente.

Fondamentalmente mi piacerebbe avere un'opzione come 'usa snapshot costruito localmente' all'interno di qualsiasi modulo nel mio profilo su qualsiasi istantanea remota, anche se il timestamp indica che lo snapshot remoto è più recente.

Cosa hanno fatto altre persone in questo scenario?

grazie,

Paul

+0

'Ciò può causare interruzioni in cui altri moduli si aspettano il modulo modificato localmente. Se il modulo è stato modificato localmente, è sufficiente compilarlo e si avrà lo snapshot più recente nel repository locale e verrà utilizzato per la generazione. O non capisco qualcosa? –

+2

Questo è davvero quello che faccio. Il problema sembra sorgere quando si dice che un modulo successivo ha una dipendenza da questo modulo costruito localmente. Maven a questo punto controlla se uno snapshot remoto ha un timestamp più tardi di questo snapshot locale e in tal caso scarica e installa quella snapshot nel mio repository locale sovrascrivendo il mio modulo creato localmente. –

+0

Btw apprezzo che parte di questo problema è che sto distribuendo tutte le istantanee nella mia build centrale, anche se non tutte sono cambiate ... Non sono sicuro di come impostare una build/deploy che possa essere distribuita in modo intelligente solo cambiata modules –

risposta

0

Problema manufatti devono essere aggiornati e ciò che non deve essere aggiornato è un problema molto difficile non solo per Maven, ma per l'utente troppo. Maven non è un'IA. Penso che puoi costruire il tuo progetto in modalità offline per evitare il download di artefatti (ma, certo, gli artefatti che vuoi essere aggiornati non saranno aggiornati).

3 anni fa abbiamo provato a risolvere questo problema in questo modo: build (la tua build centrale) deve contenere solo versioni (senza istantanee). Lì - puoi essere sicuro che se costruisci un progetto - è stabile lo stesso codice. Se modifichi alcuni artefatti, crei un'istantanea del modulo e quando il lavoro è terminato, crei la versione e aggiorni le dipendenze. Ma, porta ad un altro problema: se non hai un grande sistema di test automatici puoi passare molto tempo solo per creare versioni (bug -> correzione -> versione -> bug -> correzione -> versione - > ecc.).

Oggi lavoro in una piccola squadra e se qualcuno aggiorna la sua parte ha appena detto che e tutti quelli che vogliono l'aggiornamento - prendi - e chi no - non prendere.

Non sono un guru in queste domande. Quindi, sarò lieto di sentire un modo più semplice per evitare questo problema.

1

Penso che sarebbe necessario impedire l'implementazione di istantanee non modificate.Distribuzione di una fotografia istantanea è sostanzialmente dicendo:

"questo è ora l'ultima e più grande snapshot, mi scegliere su anziani (in senso di timestamp) istantanee"

Credo che si potrebbe fare un po 'jiggery -pokery alle tue istantanee locali, come il collegamento di alcuni script alla fase install che imposta i metadati del timestamp dell'istantanea nel lontano futuro (quindi Maven sceglie sempre l'istantanea locale su remoto). Ma non mi sembra affatto buono!

Le distribuzioni di istantanee possono essere attivate dal controllo del codice sorgente. Puoi farlo invece?

7

Se è possibile aggiornare a Maven 3, è possibile utilizzare lo switch della riga di comando --no-snapshot-updates (-nsu anche per salvare la digitazione). C'è un bug con quell'opzione corretta in 3.0.4, quindi assicurati di utilizzare l'ultima versione.

Si potrebbe anche provare la modalità offline, ma ciò interromperà TUTTI i controlli di aggiornamento fino a quando non si smetterà di essere "offline". Per prima cosa, fai una build per assicurarti di avere tutte le dipendenze scaricate nel tuo repository locale. È quindi possibile accedere alla modalità offline aggiungendo <offline>true</offline> al proprio settings.xml (e passando a false quando si è pronti per iniziare a controllare la disponibilità degli aggiornamenti) o utilizzando lo switch da riga di comando -o o --offline durante la creazione. Questo funziona in Maven 2 o 3.

0

So che questo è molto vecchio, ma è venuto attraverso lo stesso problema e risolto suddividendo la formazione in due fasi:

  1. mvn -U dipendenza: albero
  2. mvn prova

il primo passo lo fa l'aggiornamento snapshot senza costruire nulla e corre molto veloce.

Quindi il secondo passo è un normale build/test, ma SENZA snapshot di aggiornamento.

Problemi correlati