Che cos'è esattamente un'istantanea Maven e perché ne abbiamo bisogno?


Risposte:


1013

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

L'idea è che prima che venga fatta una 1.0versione (o qualsiasi altra versione), esiste un 1.0-SNAPSHOT. Quella versione è ciò che potrebbe diventare 1.0 . Fondamentalmente è "in 1.0fase di sviluppo". Questo potrebbe essere vicino a una 1.0versione reale o piuttosto lontano (subito dopo la 0.9versione, 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-SNAPSHOToggi 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.


67
@amphibient: No, l'istantanea non è necessariamente più stabile: è solo l'ultima build. Lo snapshot precede il rilascio effettivo, non lo segue. In effetti, i numeri di versione in genere non si riferiscono ai rami.
avandeursen,

9
Le istantanee di @avandeursen non hanno necessariamente la semantica che rivendichi. Puoi avere "master-SNAPSHOT" e successivamente rilasciare una versione 1.0. non deve essere "FutureVersion-SNAPSHOT", né necessariamente precedere un rilascio. Tutto il resto è giusto però: è un riferimento instabile a un bersaglio in movimento e non può essere invocato per produrre una build ripetibile.
Scott Carey,

3
Grazie @ScottCarey. "Precedentemente comuni" sarebbero probabilmente più accurati, in quanto non esiste nemmeno la garanzia che il "bersaglio mobile" alla fine esisterà.
avandeursen,

1
@Jay: no, per quanto ne so non c'è modo di fare riferimento esplicito a uno specifico SNAPSHOT, non sono indirizzabili / intercambiabili in base alla progettazione. Se hai bisogno di un controllo delle versioni dettagliato, devi semplicemente rilasciare i candidati al rilascio con stringhe di versione specifiche (-RC1, -RC2 o qualcosa del genere).
Joachim Sauer,

14
Perché non possono semplicemente chiamarlo " 1.0-DEVELOPMENT" o " 1.0-INPROGRESS", perché le persone devono usare termini non ovvi
uh_big_mike_boi

792

Le altre tre risposte ti danno una buona visione di cosa sia una -SNAPSHOTversione. Volevo solo aggiungere alcune informazioni sul comportamento di Maven quando trova una SNAPSHOTdipendenza.

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.xmlo 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.jarlibreria è 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.jarlibreria, 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 XXXpuò essere:

  • sempre : Maven verificherà una versione più recente su ogni build;
  • ogni giorno , il valore predefinito;
  • intervallo: XXX : un intervallo in minuti (XXX)
  • mai : Maven non proverà mai a recuperare un'altra versione. Lo farà solo se non esiste localmente. Con la configurazione, la SNAPSHOTversione verrà gestita come librerie stabili.

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


2
Sembra che sia possibile utilizzare l'opzione della riga di comando per forzare il download di tutte le SNAPSHOTversioni di maven : mvn clean package -Ucome da maven tutorial
Dimitry K

3
Attento con la -Ubandiera. Potrebbe non fare quello che ti aspetti a causa di MNG-4142 .
Kevin Cross

3
Vale anche la pena ricordare che le buone pratiche non richiedono l'uso di dipendenze di istantanee quando si crea una versione di rilascio, e infatti il ​​plugin di rilascio di Maven fallirà se sono presenti dipendenze di istantanee.
RCross

2
Ho corso mvn installper 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 installnon sembrava cambiarlo nel mio repository locale. È quel comportamento previsto? Non posso riutilizzare una versione e sovrascriverla con mvn installdopo averla modificata?
Don Cheadle,

1
@mmcrae AFAIK dovrebbe essere aggiornato. Ecco cosa fa l'obiettivo di installazione , aggiornando i barattoli SNAPSHOT locali. Hai scoperto qualcos'altro?
Johnny,

73

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 .


In termini di versione semantica , una versione -SNAPSHOT sarebbe una pre-release: " Una versione pre-release indica che la versione è instabile e potrebbe non soddisfare i requisiti di compatibilità previsti, come indicato dalla versione normale associata. Esempi: 1.0.0 -alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92. "
avandeursen

3
Mi sembra che "SNAPSHOT" non sia "un'istantanea del codice in un momento specifico", ma piuttosto "l'ultima build del codice disponibile". Se questo fosse HTTP, sarebbe la bandiera che dice "Non preoccuparti di fare HEAD, vai comunque a prendere qualunque cosa sia sul server". In effetti, è quasi l'opposto "codice in un dato momento".
lilbyrdie,

Che cos'è lo sviluppo "pesante"?
Joker

1
@Joker "pesante" è quando cambiano molte cose (nuove funzionalità, refactoring ecc.)
robert

28

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. ;)


21

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>

Esperto di

Un esempio di processo di rilascio di Maven

inserisci qui la descrizione dell'immagine


6

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 -SNAPSHOTma 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.4una 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).

Hai qualche informazione su come Mven gestisce i metadati di build o le convenzioni di denominazione pre-release? Voglio dire, sappiamo tutti che alfa precede la beta, ma Maven lo sa? Anche se prende 1.2.3-beta.4 come versione stabile, almeno sa che 1.2.3 è DOPO?
DGoiko,

5

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.


5

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

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

  2. Build di rilascio: Release significa rimuovere SNAPSHOT alla versione per il build, queste sono le versioni di build regolari.


3

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


1

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.


1

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.


0

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.

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.