Risposte:
Una versione di snapshot in Maven è una versione che non è stata rilasciata.
L'idea è che prima che venga fatta una 1.0
versione (o qualsiasi altra versione), esiste un 1.0-SNAPSHOT
. Quella versione è ciò che potrebbe diventare 1.0
. Fondamentalmente è "in 1.0
fase di sviluppo". Questo potrebbe essere vicino a una 1.0
versione reale o piuttosto lontano (subito dopo la 0.9
versione, ad esempio).
La differenza tra una versione "reale" e una versione di snapshot è che le snapshot potrebbero ottenere aggiornamenti. Ciò significa che il download di 1.0-SNAPSHOT
oggi potrebbe dare un file diverso rispetto al download di ieri o di domani.
Di solito, le dipendenze di istantanee dovrebbero esistere solo durante lo sviluppo e nessuna versione rilasciata (ovvero nessuna non istantanea) dovrebbe avere una dipendenza da una versione di istantanea.
1.0-DEVELOPMENT
" o " 1.0-INPROGRESS
", perché le persone devono usare termini non ovvi
Le altre tre risposte ti danno una buona visione di cosa sia una -SNAPSHOT
versione. Volevo solo aggiungere alcune informazioni sul comportamento di Maven quando trova una SNAPSHOT
dipendenza.
Quando si crea un'applicazione, Maven cercherà le dipendenze nel repository locale . Se non viene trovata una versione stabile, cercherà nei 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 foo-1.0.jar
libreria è considerata una versione stabile e se Maven la trova nel repository locale, la utilizzerà per la build corrente.
Ora, se hai bisogno di una foo-1.0-SNAPSHOT.jar
libreria, Maven saprà che questa versione non è stabile ed è soggetta a modifiche. Ecco perché Maven proverà a trovare una versione più recente nei repository remoti, anche se una versione di questa libreria viene trovata nel repository locale. Tuttavia, questo controllo viene eseguito solo una volta al giorno. Ciò significa che se hai un foo-1.0-20110506.110000-1.jar
(cioè questa libreria è stata generata il 2011/05/06 alle 11:00:00) nel tuo repository locale e se esegui di nuovo la build Maven lo stesso giorno, Maven non controllerà i repository per una versione più recente.
Maven ti offre un modo per cambiare questo criterio di aggiornamento nella definizione del tuo repository:
<repository>
<id>foo-repository</id>
<url>...</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>XXX</updatePolicy>
</snapshots>
</repository>
dove XXX
può essere:
SNAPSHOT
versione verrà gestita come librerie stabili.(il modello di settings.xml può essere trovato qui)
SNAPSHOT
versioni di maven : mvn clean package -U
come da maven tutorial
-U
bandiera. Potrebbe non fare quello che ti aspetti a causa di MNG-4142 .
mvn install
per installare un vaso della versione 1.0-SNAPSHOT nel mio repository locale. Il giorno successivo ho apportato modifiche al progetto ma non ho modificato la versione, quindi durante l'esecuzione mvn install
non sembrava cambiarlo nel mio repository locale. È quel comportamento previsto? Non posso riutilizzare una versione e sovrascriverla con mvn install
dopo averla modificata?
Il termine "SNAPSHOT" indica che la build è un'istantanea del codice in un determinato momento.
Di solito significa che questa versione è ancora in fase di sviluppo.
Quando il codice è pronto ed è il momento di rilasciarlo, è necessario modificare la versione elencata nel POM. Quindi invece di avere un "SNAPSHOT" useresti un'etichetta come "1.0".
Per un po 'di aiuto con il versioning, controlla le specifiche di Semantic Versioning .
Una "versione" è la build finale per una versione che non cambia.
Una "istantanea" è una build che può essere sostituita da un'altra build con lo stesso nome. Implica che la build potrebbe cambiare in qualsiasi momento ed è ancora in fase di sviluppo attivo.
Hai diversi artefatti per build diverse basate sullo stesso codice. Ad esempio potresti averne uno con 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 gli artefatti di questo progetto in un repository Maven, Maven espande questa versione a "1.0-20080207-230803-1" se si dovesse distribuire una versione 11 : 20:00 il 7 febbraio 2008 UTC. In altre parole, quando si distribuisce un'istantanea, non si sta rilasciando un componente software; stai rilasciando un'istantanea di un componente in un momento specifico.
Quindi, principalmente le versioni di snapshot vengono utilizzate per progetti in fase di sviluppo attivo. Se il progetto dipende da un componente software in fase di sviluppo attivo, è possibile dipendere da una versione dell'istantanea e Maven tenterà periodicamente di scaricare l'ultima istantanea da un repository quando si esegue una build. Allo stesso modo, se la prossima versione del tuo sistema avrà una versione “1.8”, il tuo progetto avrebbe una versione “1.8-SNAPSHOT” fino a quando non sarà rilasciato ufficialmente.
Ad esempio, la seguente dipendenza scarica sempre l'ultimo JAR di sviluppo 1.8 di Spring:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>1.8-SNAPSHOT”</version>
</dependency>
Un esempio di processo di rilascio di Maven
Vorrei fare un punto sulla terminologia. Le altre risposte hanno dato buone spiegazioni su cosa sia una versione "istantanea" nel contesto di Maven. Ma ne consegue che una versione non snapshot dovrebbe essere definita una versione di "rilascio"?
C'è una certa tensione tra l'idea di versione semantica di una versione di "rilascio", che sembrerebbe essere qualsiasi versione che non ha un qualificatore come -SNAPSHOT
ma non ha anche un qualificatore come -beta.4
; e l'idea di Maven di una versione "release", che sembra includere solo l'assenza di -SNAPSHOT
.
In altre parole, c'è un'ambiguità semantica sul fatto che "rilascio" significhi "possiamo rilasciarlo a Maven Central" o "il software è nella sua versione finale al pubblico". Potremmo considerare -beta.4
una versione "release" se la rilasciamo al pubblico, ma non è una "release finale". Il versioning semantico afferma chiaramente che qualcosa del genere -beta.4
è una versione "pre-release", quindi non avrebbe senso che venga chiamata una versione "release", anche senza -SNAPSHOT
. In effetti, per definizione, -rc.5
è anche un candidato al rilascio , non un rilascio effettivo, anche se potremmo consentire l'accesso del pubblico ai test.
Quindi, nonostante Maven, a mio avviso sembra più appropriato solo chiamare una versione di "rilascio" che non ha alcun qualificatore, nemmeno -beta.4
. Forse un nome migliore per una versione non snapshot di Maven sarebbe una versione "stabile" (ispirata a un'altra risposta ). Quindi avremmo:
1.2.3-beta.4-SNAPSHOT
: Una versione di istantanea di una versione non definitiva.1.2.3-SNAPSHOT
: Una versione di istantanea di una versione di rilascio.1.2.3-beta.4
: Una versione stabile di una versione non definitiva.1.2.3
: Una versione di rilascio (che è una versione stabile, non istantanea, ovviamente).Ecco come appare un'istantanea per un repository e in questo caso non è abilitata, il che significa che il repository indicato qui è stabile e non sono necessari aggiornamenti.
<project>
...
<repositories>
<repository>
<id>lds-main</id>
<name>LDS Main Repo</name>
<url>http://code.lds.org/nexus/content/groups/main-repo</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
Un altro caso sarebbe per:
<snapshots>
<enabled>true</enabled>
</snapshots>
il che significa che Maven cercherà gli aggiornamenti per questo repository. È inoltre possibile specificare un intervallo per gli aggiornamenti con tag.
di solito in Maven abbiamo due tipi di build 1) Build snapshot 2) Release build
build di snapshot: SNAPSHOT è la versione speciale che indica che la copia di distribuzione corrente non è come una versione normale, maven controlla la versione per ogni build nel repository remoto, quindi le build di snapshot non sono altro che build di sviluppo.
Build di rilascio: Release significa rimuovere SNAPSHOT alla versione per il build, queste sono le versioni di build regolari.
semplicemente un'istantanea significa che è la versione che non è stabile.
quando la versione include uno snapshot come 1.0.0 -SNAPSHOT significa che non è una versione stabile e cerca un repository remoto per risolvere le dipendenze
comprendere il contesto di SDLC aiuterà a capire la differenza tra istantanea e rilascio. Durante il processo di sviluppo, tutti gli sviluppatori contribuiscono con le loro funzionalità a un ramo di base. Ad un certo punto il lead pensa che si siano accumulate abbastanza funzionalità, quindi taglierà un ramo di rilascio dal ramo di base. Eventuali build precedenti a questo punto temporale sono istantanee. Le build post a questo punto sono versioni. Da notare, anche le build di rilascio potrebbero cambiare prima di passare alla produzione se si riscontrano difetti durante il test di rilascio.
Snapshot significa semplicemente che, a seconda della configurazione, Maven verificherà le ultime modifiche su una dipendenza speciale. Lo snapshot è instabile perché è in fase di sviluppo ma se su un progetto speciale è necessario apportare le ultime modifiche, è necessario configurare la versione di dipendenza per la versione di snapshot. Questo scenario si verifica nelle grandi organizzazioni con più prodotti che questi prodotti sono strettamente correlati tra loro.
Come suggerisce il nome, l'istantanea si riferisce a uno stato del progetto e alle sue dipendenze in quel momento. Ogni volta che Maven trova un nuovo SNAPSHOT del progetto, scarica e sostituisce il vecchio file .jar del progetto nel repository locale.
Le versioni di snapshot vengono utilizzate per progetti in fase di sviluppo attivo. Se il progetto dipende da un componente software in fase di sviluppo attivo, è possibile dipendere da una versione dell'istantanea e Maven tenterà periodicamente di scaricare l'ultima istantanea da un repository quando si esegue una build.