Was genau ist ein Maven Snapshot und warum brauchen wir ihn?


Antworten:


1013

Eine Snapshot-Version in Maven wurde noch nicht veröffentlicht.

Die Idee ist, dass es vor einer 1.0Veröffentlichung (oder einer anderen Veröffentlichung) eine gibt 1.0-SNAPSHOT. Diese Version könnte werden 1.0 . Es ist im Grunde " 1.0in Entwicklung". Dies kann nahe an einer echten 1.0Veröffentlichung liegen oder ziemlich weit ( 0.9zum Beispiel direkt nach der Veröffentlichung).

Der Unterschied zwischen einer "echten" Version und einer Snapshot-Version besteht darin, dass Snapshots möglicherweise aktualisiert werden. Das bedeutet, dass das Herunterladen von 1.0-SNAPSHOTheute möglicherweise eine andere Datei ergibt als das Herunterladen von gestern oder morgen.

Normalerweise sollten Snapshot-Abhängigkeiten nur während der Entwicklung vorhanden sein und keine freigegebene Version (dh kein Nicht-Snapshot) sollte von einer Snapshot-Version abhängig sein.


67
@amphibient: Nein, der Snapshot ist nicht unbedingt stabiler: Es ist nur der neueste Build. Der Schnappschuss geht der eigentlichen Veröffentlichung voraus , er kommt nicht danach. In der Tat beziehen sich Versionsnummern normalerweise nicht auf Zweige.
Avandeursen

9
@ avandeursen-Schnappschüsse haben nicht unbedingt die von Ihnen behauptete Semantik. Sie können "master-SNAPSHOT" haben und später eine Version 1.0 erstellen. Es muss weder "FutureVersion-SNAPSHOT" sein, noch muss es jemals einer Veröffentlichung vorausgehen. Alles andere ist jedoch richtig - es ist eine instabile Referenz auf ein sich bewegendes Ziel und kann nicht als verlässlicher Build angesehen werden.
Scott Carey

3
Danke @ScottCarey. "Häufig vorausgehend" wäre wahrscheinlich genauer, da es nicht einmal eine Garantie dafür gibt, dass das "sich bewegende Ziel" irgendwann existieren wird.
Avandeursen

1
@ Jay: Nein, soweit ich weiß, gibt es keine Möglichkeit, explizit auf einen bestimmten SNAPSHOT zu verweisen. Sie sind vom Design her nicht adressierbar / austauschbar. Wenn Sie eine fein abgestimmte Versionierung benötigen, sollten Sie nur Release-Kandidaten mit bestimmten Versionszeichenfolgen (-RC1, -RC2 oder ähnliches) freigeben.
Joachim Sauer

14
Warum können sie es nicht einfach " 1.0-DEVELOPMENT" nennen oder " 1.0-INPROGRESS" mögen , warum müssen die Leute nicht offensichtliche Begriffe verwenden
uh_big_mike_boi

792

Die drei anderen Antworten geben Ihnen eine gute Vorstellung davon, was eine -SNAPSHOTVersion ist. Ich wollte nur einige Informationen zum Verhalten von Maven hinzufügen, wenn es eine SNAPSHOTAbhängigkeit findet.

Wenn Sie eine Anwendung erstellen, sucht Maven im lokalen Repository nach Abhängigkeiten . Wenn dort keine stabile Version gefunden wird, durchsucht es die Remote-Repositorys (definiert in settings.xmloder pom.xml), um diese Abhängigkeit abzurufen. Anschließend wird es in das lokale Repository kopiert, um es für die nächsten Builds verfügbar zu machen.

Beispielsweise wird eine foo-1.0.jarBibliothek als stabile Version betrachtet. Wenn Maven sie im lokalen Repository findet, wird sie für den aktuellen Build verwendet.

Wenn Sie nun eine foo-1.0-SNAPSHOT.jarBibliothek benötigen , weiß Maven, dass diese Version nicht stabil ist und Änderungen unterliegt. Aus diesem Grund wird Maven versuchen, eine neuere Version in den Remote-Repositorys zu finden, auch wenn eine Version dieser Bibliothek im lokalen Repository gefunden wird. Diese Überprüfung wird jedoch nur einmal pro Tag durchgeführt. Das bedeutet , dass , wenn Sie ein foo-1.0-20110506.110000-1.jarin Ihrem lokalen Repository (dh diese Bibliothek wird auf 2011.05.06 bei 11.00.00 erzeugt worden ist ), und wenn Sie das Maven Build wieder am selben Tag laufen, Maven werden nicht die Repositories prüfen für eine neuere Version.

Maven bietet Ihnen eine Möglichkeit, diese Aktualisierungsrichtlinie in Ihrer Repository-Definition zu ändern:

<repository>
    <id>foo-repository</id>
    <url>...</url>
    <snapshots>
        <enabled>true</enabled>
        <updatePolicy>XXX</updatePolicy>
    </snapshots>
</repository>

wo XXXkann sein:

  • Immer : Maven sucht bei jedem Build nach einer neueren Version.
  • täglich der Standardwert;
  • Intervall: XXX : ein Intervall in Minuten (XXX)
  • Niemals : Maven wird niemals versuchen, eine andere Version abzurufen. Dies ist nur möglich, wenn es lokal nicht vorhanden ist. Mit der Konfiguration wird die SNAPSHOTVersion als stabile Bibliothek behandelt.

(Modell der settings.xml finden Sie hier)


2
Es scheint möglich zu sein, den Befehlszeilenschalter zu verwenden, um das erneute Herunterladen aller SNAPSHOTVersionen zu erzwingen : mvn clean package -Ugemäß Maven-Tutorial
Dimitry K

3
Vorsicht mit der -UFlagge. Aufgrund von MNG-4142 funktioniert es möglicherweise nicht so, wie Sie es erwarten .
Kevin Cross

3
Erwähnenswert ist auch, dass nach bewährten Methoden beim Erstellen einer Release-Version keine Snapshot-Abhängigkeiten verwendet werden müssen. Das Maven Release Plugin schlägt tatsächlich fehl, wenn Snapshot-Abhängigkeiten vorhanden sind.
RCross

2
Ich lief mvn install, um ein Glas der Version 1.0-SNAPSHOT in meinem lokalen Repo zu installieren. Am nächsten Tag nahm ich Änderungen am Projekt vor, änderte aber nicht die Version - dann mvn installschien es beim Ausführen in meinem lokalen Repo nichts zu ändern. Ist das erwartetes Verhalten? Kann ich eine Version nicht wiederverwenden und überschreiben, mvn installnachdem ich Änderungen daran vorgenommen habe?
Don Cheadle

1
@mmcrae AFAIK sollte es aktualisiert werden. Das ist das Ziel der Installation , lokale SNAPSHOT-Jars zu aktualisieren. Hast du noch etwas entdeckt?
Johnny

73

Der Begriff "SNAPSHOT" bedeutet, dass der Build eine Momentaufnahme Ihres Codes zu einem bestimmten Zeitpunkt ist.

Dies bedeutet normalerweise, dass sich diese Version noch in einer intensiven Entwicklung befindet.

Wenn der Code fertig ist und es Zeit ist, ihn freizugeben, möchten Sie die im POM aufgeführte Version ändern. Dann würden Sie anstelle eines "SNAPSHOT" ein Label wie "1.0" verwenden.

Weitere Informationen zur Versionierung finden Sie in der Semantic Versioning-Spezifikation .


In Bezug auf die semantische Versionierung wäre eine -SNAPSHOT-Version eine Vorabversion: " Eine Vorabversion zeigt an, dass die Version instabil ist und möglicherweise nicht die beabsichtigten Kompatibilitätsanforderungen erfüllt, die in der zugehörigen normalen Version angegeben sind. Beispiele: 1.0.0 -alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92. "
avandeursen

3
Es klingt für mich so, als wäre "SNAPSHOT" kein "Schnappschuss Ihres Codes zu einem bestimmten Zeitpunkt", sondern "der neueste verfügbare Build des Codes". Wenn dies HTTP wäre, wäre es das Flag, das besagt: "Mach keinen HEAD, hol dir sowieso, was auch immer auf dem Server ist." In der Tat ist es fast das Gegenteil von "Code zu einem bestimmten Zeitpunkt".
Lilbyrdie

Was ist "schwere" Entwicklung?
Joker

1
@Joker „schwer“ ist , wenn viele Dinge sind (neue Funktionen, Refactoring etc.) zu ändern
robert

28

Ein "Release" ist der endgültige Build für eine Version, die sich nicht ändert.

Ein "Snapshot" ist ein Build, der durch einen anderen Build mit demselben Namen ersetzt werden kann. Dies bedeutet, dass sich der Build jederzeit ändern kann und sich noch in der aktiven Entwicklung befindet.

Sie haben verschiedene Artefakte für verschiedene Builds, die auf demselben Code basieren. Zum Beispiel könnten Sie eine mit und ohne Debugging haben. Eine für Java 5.0 und eine für Java 6. Im Allgemeinen ist es einfacher, einen Build zu haben, der alles tut, was Sie brauchen. ;)


21

Maven-Versionen können ein String-Literal "SNAPSHOT" enthalten, um anzuzeigen, dass sich ein Projekt derzeit in der aktiven Entwicklung befindet.

Wenn Ihr Projekt beispielsweise eine Version von "1.0-SNAPSHOT" hat und Sie die Artefakte dieses Projekts in einem Maven-Repository bereitstellen, würde Maven diese Version auf "1.0-20080207-230803-1" erweitern, wenn Sie eine Version um 11 bereitstellen würden : 08.00 Uhr am 7. Februar 2008 UTC. Mit anderen Worten, wenn Sie einen Snapshot bereitstellen, veröffentlichen Sie keine Softwarekomponente. Sie veröffentlichen zu einem bestimmten Zeitpunkt einen Snapshot einer Komponente.

Daher werden hauptsächlich Snapshot-Versionen für Projekte verwendet, die sich in der aktiven Entwicklung befinden. Wenn Ihr Projekt von einer Softwarekomponente abhängt, die sich in der aktiven Entwicklung befindet, können Sie sich auf eine Snapshot-Version verlassen. Maven versucht regelmäßig, den neuesten Snapshot aus einem Repository herunterzuladen, wenn Sie einen Build ausführen. Wenn die nächste Version Ihres Systems eine Version „1.8“ haben soll, hat Ihr Projekt eine Version „1.8-SNAPSHOT“, bis es offiziell veröffentlicht wurde.

Beispielsweise würde die folgende Abhängigkeit immer die neueste 1.8-Entwicklungs-JAR des Frühlings herunterladen:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>1.8-SNAPSHOT”</version>
    </dependency>

Maven

Ein Beispiel für einen Maven-Release-Prozess

Geben Sie hier die Bildbeschreibung ein


6

Ich möchte auf die Terminologie eingehen. Die anderen Antworten gaben gute Erklärungen darüber, was eine "Schnappschuss" -Version im Kontext von Maven ist. Aber folgt daraus, dass eine Nicht-Snapshot-Version als "Release" -Version bezeichnet werden sollte?

Es besteht eine gewisse Spannung zwischen der semantischen Versionierungsidee einer "Release" -Version, bei der es sich anscheinend um eine Version handelt, die kein Qualifikationsmerkmal wie, -SNAPSHOTaber auch kein Qualifikationsmerkmal wie z -beta.4. und Mavens Idee einer "Release" -Version, die nur das Fehlen von zu beinhalten scheint -SNAPSHOT.

Mit anderen Worten, es gibt eine semantische Unklarheit darüber, ob "Release" bedeutet "wir können es für Maven Central freigeben" oder "die Software befindet sich in ihrer endgültigen Veröffentlichung für die Öffentlichkeit". Wir könnten -beta.4eine "Release" -Version in Betracht ziehen , wenn wir sie der Öffentlichkeit zugänglich machen, aber es ist keine "endgültige Veröffentlichung". Die semantische Versionierung besagt eindeutig, dass so etwas wie -beta.4eine "Pre-Release" -Version ist, daher wäre es auch ohne sie nicht sinnvoll, sie als "Release" -Version zu bezeichnen -SNAPSHOT. Tatsächlich ist es per Definition sogar -rc.5ein Release- Kandidat , kein tatsächliches Release, obwohl wir möglicherweise den öffentlichen Zugriff zum Testen zulassen.

Trotz Maven scheint es meiner Meinung nach angemessener, nur eine "Release" -Version zu nennen, die überhaupt kein Qualifikationsmerkmal hat, nicht einmal -beta.4. Vielleicht wäre ein besserer Name für eine Maven-Nicht-Snapshot-Version eine "stabile" Version (inspiriert von einer anderen Antwort ). So hätten wir:

  • 1.2.3-beta.4-SNAPSHOT: Eine Snapshot-Version einer Vorabversion.
  • 1.2.3-SNAPSHOT: Eine Snapshot-Version einer Release-Version.
  • 1.2.3-beta.4: Eine stabile Version einer Vorabversion.
  • 1.2.3: Eine Release-Version (die natürlich eine stabile Version ohne Snapshot ist).

Haben Sie Informationen darüber, wie Maven mit Build-Metadaten oder Namenskonventionen vor der Veröffentlichung umgeht? Ich meine, wir alle wissen, dass Alfa der Beta vorausgeht, aber weiß Maven es? Selbst wenn 1.2.3-beta.4 als stabile Version verwendet wird, weiß es zumindest, dass 1.2.3 NACH ihm ist?
DGoiko

5

So sieht ein Snapshot für ein Repository aus und ist in diesem Fall nicht aktiviert. Dies bedeutet, dass das hier genannte Repository stabil ist und keine Aktualisierungen erforderlich sind.

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

Ein anderer Fall wäre für:

<snapshots>
        <enabled>true</enabled>
</snapshots>

Dies bedeutet, dass Maven nach Updates für dieses Repository sucht. Sie können auch ein Intervall für die Aktualisierungen mit Tag angeben.


5

Normalerweise haben wir in Maven zwei Arten von Builds: 1) Snapshot-Builds 2) Release-Builds

  1. Snapshot-Builds: SNAPSHOT ist die spezielle Version, die angibt, dass die aktuelle Bereitstellungskopie nicht wie eine reguläre Version ist. Maven überprüft die Version für jeden Build im Remote-Repository, sodass die Snapshot-Builds nichts anderes als Entwicklungs-Builds sind.

  2. Builds freigeben: Release bedeutet, dass der SNAPSHOT in der Version für den Build entfernt wird. Dies sind die regulären Build-Versionen.


3

Einfacher Schnappschuss bedeutet, dass es sich um die nicht stabile Version handelt.

Wenn die Version einen Snapshot wie 1.0.0 enthält, bedeutet -SNAPSHOT, dass es sich nicht um eine stabile Version handelt, und suchen Sie nach einem Remote-Repository, um Abhängigkeiten aufzulösen


1

Wenn Sie den Kontext von SDLC verstehen, können Sie den Unterschied zwischen Snapshot und Release besser verstehen. Während des Entwicklungsprozesses tragen alle Entwickler ihre Funktionen zu einem Basiszweig bei. Irgendwann glaubt der Lead, dass sich genügend Features angesammelt haben, und schneidet dann einen Release-Zweig aus dem Basiszweig. Alle Builds vor diesem Zeitpunkt sind Schnappschüsse. Builds nach diesem Punkt sind Releases. Beachten Sie, dass sich auch Release-Builds vor Produktionsbeginn ändern können, wenn während des Release-Tests Fehler auftreten.


1

Snapshot bedeutet einfach, dass Maven abhängig von Ihrer Konfiguration die neuesten Änderungen in Abhängigkeit von einer speziellen Abhängigkeit überprüft. Snapshot ist instabil, da es sich in der Entwicklung befindet. Wenn jedoch in einem speziellen Projekt die neuesten Änderungen erforderlich sind, müssen Sie Ihre Abhängigkeitsversion für die Snapshot-Version konfigurieren. Dieses Szenario tritt in großen Organisationen mit mehreren Produkten auf, die sehr eng miteinander verbunden sind.


0

Wie der Name schon sagt, bezieht sich Snapshot auf einen Projektstatus und seine Abhängigkeiten zu diesem Zeitpunkt. Immer wenn maven einen neueren SNAPSHOT des Projekts findet, lädt er die ältere JAR-Datei des Projekts im lokalen Repository herunter und ersetzt sie.

Snapshot-Versionen werden für Projekte verwendet, die sich in der aktiven Entwicklung befinden. Wenn Ihr Projekt von einer Softwarekomponente abhängt, die sich in der aktiven Entwicklung befindet, können Sie sich auf eine Snapshot-Version verlassen. Maven versucht regelmäßig, den neuesten Snapshot aus einem Repository herunterzuladen, wenn Sie einen Build ausführen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.