Cos’è esattamente un’istantanea Maven e perché ne abbiamo bisogno?

Sono un po ‘confuso riguardo al significato di un’istantanea Maven e perché ne costruiamo uno?

Una versione di istantanee in Maven è una versione che non è stata rilasciata.

L’idea è che prima che venga eseguita una versione 1.0 (o qualsiasi altra versione), esiste 1.0-SNAPSHOT . Quella versione potrebbe diventare 1.0 . È fondamentalmente ” 1.0 fase di sviluppo”. Questo potrebbe essere vicino a una versione 1.0 reale o piuttosto lontana (subito dopo la versione 0.9 , ad esempio).

La differenza tra una versione “reale” e una versione istantanea è che gli snapshot potrebbero ricevere aggiornamenti. Ciò significa che scaricare 1.0-SNAPSHOT oggi potrebbe dare un file diverso rispetto a scaricarlo ieri o domani.

Di solito, le dipendenze dello snapshot dovrebbero esistere solo durante lo sviluppo e nessuna versione rilasciata (cioè nessuna non snapshot) dovrebbe avere una dipendenza da una versione di istantanea.

Le altre tre risposte forniscono una buona visione di ciò che è una versione di -SNAPSHOT . Volevo solo aggiungere alcune informazioni riguardanti il ​​comportamento di Maven quando trova una dipendenza SNAPSHOT .

Quando costruisci un’applicazione, Maven cerca le dipendenze nel repository locale . Se non viene trovata una versione stabile, cercherà i repository remoti (definiti in settings.xml o pom.xml ) per recuperare questa dipendenza. Quindi, lo copierà nel repository locale, per renderlo disponibile per le build successive.

Ad esempio, una libreria foo-1.0.jar è considerata una versione stabile e, se Maven la trova nel repository locale, userà questa per la build corrente.

Ora, se hai bisogno di una libreria foo-1.0-SNAPSHOT.jar , Maven saprà che questa versione non è stabile ed è soggetta a modifiche. Ecco perché Maven cercherà di trovare una versione più recente nei repository remoti, anche se una versione di questa libreria si trova nel repository locale. Tuttavia, questo controllo viene effettuato solo una volta al giorno. Ciò significa che se hai un foo-1.0-20110506.110000-1.jar (ovvero questa libreria è stata generata il 2011/05/06 alle 11:00:00) nel tuo repository locale, e se esegui di nuovo Maven, compila il lo stesso giorno, Maven non controllerà i repository per una versione più recente.

Maven ti offre un modo per modificare questo criterio di aggiornamento nella definizione del tuo repository:

  foo-repository ...  true XXX   

dove XXX può essere:

  • sempre : Maven verificherà una versione più recente per ogni build;
  • ogni giorno , il valore predefinito;
  • intervallo: XXX : un intervallo in minuti (XXX)
  • mai : Maven non tenterà mai di recuperare un’altra versione. Lo farà solo se non esiste localmente. Con la configurazione, la versione SNAPSHOT sarà gestita come librerie stabili.

(il modello di settings.xml può essere trovato qui)

Il termine “SNAPSHOT” indica che la build è un’istantanea del tuo codice in un dato momento.

Di solito significa che la versione è una versione ancora in fase di sviluppo.

Quando arriva il momento di rilasciare il tuo codice, vorrai cambiare la versione elencata nel pom. Quindi, invece di avere un “SNAPSHOT” avresti qualcosa come “1.0”.

Per un po ‘di aiuto con il controllo delle versioni, controlla le specifiche del Versioning semantico .

Una “release” è la build finale per una versione che non cambia.

Una “istantanea” è una build che può essere sostituita da un’altra build che ha lo stesso nome. È implicito che la build potrebbe cambiare in qualsiasi momento ed è ancora in fase di sviluppo attivo.

Hai diversi artefatti per differenti build basati sullo stesso codice. Ad esempio potresti averne uno con il debug e uno senza. Uno per Java 5.0 e uno per Java 6. Generalmente è più semplice avere una build che fa tutto il necessario. 😉

Le versioni di Maven possono contenere una stringa letterale “SNAPSHOT” per indicare che un progetto è attualmente in fase di sviluppo attivo.

Ad esempio, se il progetto ha una versione di “1.0-SNAPSHOT” e si distribuiscono le risorse di questo progetto in un repository Maven, Maven estenderebbe questa versione a “1.0-20080207-230803-1” se si distribuisse una release a 11 : 08:00 del 7 febbraio 2008 UTC. In altre parole, quando si distribuisce uno snapshot, non si sta facendo un rilascio di un componente software; stai pubblicando un’istantanea di un componente in un momento specifico.

Quindi principalmente le versioni di istantanee vengono utilizzate per progetti in sviluppo attivo. Se il progetto dipende da un componente software in fase di sviluppo attivo, è ansible dipendere da una versione di snapshot e Maven tenterà periodicamente di scaricare l’ultima istantanea da un repository quando si esegue una generazione. Allo stesso modo, se la prossima versione del tuo sistema avrà una versione “1.8”, il tuo progetto avrà una versione “1.8-SNAPSHOT” fino a quando non verrà rilasciato formalmente.

Ad esempio, la seguente dipendenza scaricherà sempre l’ultimo JAR di sviluppo 1.8 di spring:

   org.springframework spring 1.8-SNAPSHOT”  

Maven

Un esempio di processo di rilascio di Maven

inserisci la descrizione dell'immagine qui

Ecco come appare un’istantanea per un repository e in questo caso non è abilitato, il che significa che il repository di cui si fa riferimento qui è stabile e non c’è bisogno di aggiornamenti.

  ...   lds-main LDS Main Repo http://code.lds.org/nexus/content/groups/main-repo  false     

Un altro caso potrebbe essere per:

  true  

il che significa che Maven cercherà gli aggiornamenti per questo repository. È anche ansible specificare un intervallo per gli aggiornamenti con il tag.

di solito in Maven abbiamo due tipi di build 1) Snapshot build 2) Release build

  1. build snapshot: SNAPSHOT è la versione speciale che indica che la copia di implementazione corrente non è come una versione normale, ma controlla la versione per ogni build nel repository remoto in modo che le build di istantanee non siano altro che build di manutenzione.

  2. Release build: Release significa rimuovere SNAPSHOT dalla versione per la build, queste sono le versioni di build regolari.