Ich bin etwas verwirrt über die Bedeutung eines Maven-Schnappschusses und warum bauen wir einen?
quelle
Ich bin etwas verwirrt über die Bedeutung eines Maven-Schnappschusses und warum bauen wir einen?
Eine Snapshot-Version in Maven wurde noch nicht veröffentlicht.
Die Idee ist, dass es vor einer 1.0
Veröffentlichung (oder einer anderen Veröffentlichung) eine gibt 1.0-SNAPSHOT
. Diese Version könnte werden 1.0
. Es ist im Grunde " 1.0
in Entwicklung". Dies kann nahe an einer echten 1.0
Veröffentlichung liegen oder ziemlich weit ( 0.9
zum 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-SNAPSHOT
heute 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.
1.0-DEVELOPMENT
" nennen oder "1.0-INPROGRESS
" mögen , warum müssen die Leute nicht offensichtliche Begriffe verwendenDie drei anderen Antworten geben Ihnen eine gute Vorstellung davon, was eine
-SNAPSHOT
Version ist. Ich wollte nur einige Informationen zum Verhalten von Maven hinzufügen, wenn es eineSNAPSHOT
Abhä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.xml
oderpom.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.jar
Bibliothek 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.jar
Bibliothek 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 einfoo-1.0-20110506.110000-1.jar
in 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:
wo
XXX
kann sein:SNAPSHOT
Version als stabile Bibliothek behandelt.(Modell der settings.xml finden Sie hier)
quelle
SNAPSHOT
Versionen zu erzwingen :mvn clean package -U
gemäß Maven-Tutorial-U
Flagge. Aufgrund von MNG-4142 funktioniert es möglicherweise nicht so, wie Sie es erwarten .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 - dannmvn install
schien es beim Ausführen in meinem lokalen Repo nichts zu ändern. Ist das erwartetes Verhalten? Kann ich eine Version nicht wiederverwenden und überschreiben,mvn install
nachdem ich Änderungen daran vorgenommen habe?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 .
quelle
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. ;)
quelle
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:
Maven
Ein Beispiel für einen Maven-Release-Prozess
quelle
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,
-SNAPSHOT
aber 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.4
eine "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.4
eine "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.5
ein 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).quelle
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.
Ein anderer Fall wäre für:
Dies bedeutet, dass Maven nach Updates für dieses Repository sucht. Sie können auch ein Intervall für die Aktualisierungen mit Tag angeben.
quelle
Normalerweise haben wir in Maven zwei Arten von Builds: 1) Snapshot-Builds 2) Release-Builds
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.
Builds freigeben: Release bedeutet, dass der SNAPSHOT in der Version für den Build entfernt wird. Dies sind die regulären Build-Versionen.
quelle
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
quelle
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.
quelle
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.
quelle
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.
quelle