Je suis un peu confus quant à la signification d'un instantané Maven et pourquoi nous en construisons un?
Une version instantanée de Maven est une version qui n'a pas été publiée.
L'idée est que avant une version 1.0
(ou toute autre version) est terminée, il existe un 1.0-SNAPSHOT
. Cette version est ce que pourrait devenir 1.0
. C'est fondamentalement "1.0
en cours de développement". Cela pourrait être fermer à une version réelle de 1.0
ou assez loin (juste après la version 0.9
, par exemple).
La différence entre une version "réelle" et une version d'instantané est que les instantanés peuvent obtenir des mises à jour. Cela signifie que télécharger 1.0-SNAPSHOT
aujourd'hui pourrait donner un fichier différent de celui de le télécharger hier ou demain.
Habituellement, les dépendances d’instantané devraient niquement exister pendant le développement et aucune version publiée (c’est-à-dire aucune image non instantanée) ne devrait avoir une dépendance à une version d’instantané.
Les trois autres réponses vous donnent une bonne idée de ce qu'est une version _-SNAPSHOT
_. Je voulais juste ajouter quelques informations concernant le comportement de Maven quand il trouve une dépendance SNAPSHOT
.
Lorsque vous créez une application, Maven recherche les dépendances dans le référentiel local . Si aucune version stable n’y est trouvée, le système recherchera les référentiels distants (définis dans _settings.xml
_ ou _pom.xml
_) pour extraire cette dépendance. Ensuite, il le copiera dans le référentiel local afin de le rendre disponible pour les prochaines générations.
Par exemple, une bibliothèque _foo-1.0.jar
_ est considérée comme une version stable et si Maven la trouve dans le référentiel local, elle utilisera celle-ci. pour la version actuelle.
Désormais, si vous avez besoin d’une bibliothèque _foo-1.0-SNAPSHOT.jar
_, Maven saura que cette version n’est pas stable et peut être modifiée. C'est pourquoi Maven essaiera de trouver une version plus récente dans les référentiels distants, même si une version de cette bibliothèque se trouve dans le référentiel local. Cependant, cette vérification est faite seulement une fois par jour. Cela signifie que si vous avez un _foo-1.0-20110506.110000-1.jar
_ (c'est-à-dire que cette bibliothèque a été générée le 2011/05/06 à 11:00:00) dans votre référentiel local, et si vous exécutez à nouveau la compilation Maven le même jour, Maven va pas vérifier les référentiels pour une version plus récente.
Maven vous permet de modifier cette stratégie de mise à jour dans la définition de votre référentiel:
_<repository>
<id>foo-repository</id>
<url>...</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>XXX</updatePolicy>
</snapshots>
</repository>
_
où XXX
peut être:
SNAPSHOT
sera traitée comme les bibliothèques stables.(le modèle de settings.xml peut être trouvé ici)
Le terme "SNAPSHOT" signifie que la construction est un instantané de votre code à un moment donné.
Cela signifie généralement que cette version est encore en plein développement.
Lorsque le code est prêt et qu'il est temps de le publier, vous souhaiterez modifier la version répertoriée dans le POM. Ensuite, au lieu d'avoir un "SNAPSHOT", vous utiliseriez une étiquette comme "1.0".
Pour obtenir de l’aide sur la gestion des versions, consultez le spécification de gestion des versions sémantique .
Une "version" est la version finale d'une version qui ne change pas.
Un "instantané" est une version qui peut être remplacée par une autre qui porte le même nom. Cela implique que la construction peut changer à tout moment et est toujours en développement actif.
Vous avez différents artefacts pour différentes versions basées sur le même code. Par exemple. vous pourriez en avoir un avec le débogage et un sans. Un pour Java 5.0 et un pour Java 6. En général, il est plus simple d’avoir une construction qui fait tout ce dont vous avez besoin. ;)
Les versions Maven peuvent contenir un littéral de chaîne "SNAPSHOT" pour indiquer qu'un projet est actuellement en cours de développement.
Par exemple, si votre projet comporte une version "1.0-SNAPSHOT" et que vous déployez les artefacts de ce projet dans un référentiel Maven, Maven étendrait cette version à "1.0-20080207-230803-1" si vous déployiez une version à 11 : 08 PM le 7 février 2008 UTC. En d'autres termes, lorsque vous déployez un instantané, vous ne créez pas de version d'un composant logiciel. vous publiez un instantané d'un composant à un moment donné.
Les versions instantanées sont donc principalement utilisées pour les projets en développement actif. Si votre projet dépend d'un composant logiciel en cours de développement actif, vous pouvez vous fier à la publication d'un instantané. Maven tentera périodiquement de télécharger le dernier instantané à partir d'un référentiel lors de l'exécution d'une construction. De la même manière, si la version "1.8" de la prochaine version de votre système doit avoir une version "1.8-SNAPSHOT" jusqu'à la publication officielle de votre projet.
Par exemple, la dépendance suivante téléchargerait toujours le dernier fichier JAR de développement 1.8 du printemps:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>1.8-SNAPSHOT”</version>
</dependency>
Un exemple de processus de libération de maven
Voici à quoi ressemble un instantané pour un référentiel. Dans ce cas, il n'est pas activé, ce qui signifie que le référentiel référencé ici est stable et que des mises à jour ne sont pas nécessaires.
<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 autre cas serait pour:
<snapshots>
<enabled>true</enabled>
</snapshots>
ce qui signifie que Maven recherchera des mises à jour pour ce référentiel. Vous pouvez également spécifier un intervalle pour les mises à jour avec tag.
généralement dans maven, nous avons deux types de builds 1) Snapshot builds 2) Release builds
snapshot builds: SNAPSHOT est la version spéciale qui indique que la copie de déploiement actuelle n'est pas identique à une version normale. maven vérifie la version de chaque construction du référentiel distant afin que les générations d'instantané ne soient rien d'autre que des versions de développement.
Release builds: Release signifie supprimer SNAPSHOT dans la version pour la construction, il s’agit des versions classiques.
J'aimerais parler de la terminologie. Les autres réponses donnaient de bonnes explications sur ce qu'est une version "instantané" dans le contexte de Maven. Mais s'ensuit-il qu'une version sans cliché doit être qualifiée de "version"?
Il existe une certaine tension entre l'idée de versioning sémantique d'une version "release", qui semble être toute version ne possédant pas de qualificatif tel que -SNAPSHOT
mais ne disposant pas non plus d'un qualificatif tel que -beta.4
; et l'idée de Maven d'une version "release", qui ne semble inclure que l'absence de -SNAPSHOT
.
En d'autres termes, il existe une ambiguïté sémantique sur le fait de savoir si "publication" signifie "nous pouvons le publier pour Maven Central" ou "le logiciel est en cours de publication définitive". Nous pourrions considérer que -beta.4
est une version "publiée" si nous la publions au public, mais ce n'est pas une "version finale". Versioning sémantique indique clairement que quelque chose comme -beta.4
est une version "préliminaire", il n'aurait donc pas de sens de l'appeler une version "finale", même sans -SNAPSHOT
. En fait, même par définition, -rc.5
est une version candidate , et non une version réelle, même si nous pouvons autoriser un accès public à des fins de test.
Donc, nonobstant Maven, à mon avis, il semble plus approprié d’appeler une version "release" qui n’a aucun qualificateur, pas même -beta.4
. Peut-être un meilleur nom pour une version non instantanée de Maven serait-il une version "stable" (inspirée par autre réponse ). Ainsi nous aurions:
1.2.3-beta.4-SNAPSHOT
: Une version avec capture instantanée d'une version préliminaire.1.2.3-SNAPSHOT
: Une version avec capture instantanée d'une version publiée.1.2.3-beta.4
: Une version stable d'une version préliminaire.1.2.3
: Une version (qui est une version stable, non instantanée, évidemment).simplement instantané signifie que c'est la version qui n'est pas stable.
quand la version inclut un instantané du type 1.0.0, -SNAPSHOT signifie qu'il ne s'agit pas d'une version stable et qu'il faut rechercher un référentiel distant pour résoudre les dépendances
comprendre le contexte de SDLC aidera à comprendre la différence entre instantané et publication. Au cours du processus de développement, tous les développeurs contribuent leurs fonctionnalités à une branche de base. À un moment donné, le responsable pense que suffisamment de fonctionnalités se sont accumulées pour pouvoir couper une branche de publication dans la branche de base. Toutes les versions antérieures à ce moment sont des instantanés. Construit post à ce point sont des versions. Notez que les versions des versions peuvent également changer avant de passer en production si un défaut est détecté pendant les tests de version.
Instantané signifie simplement qu'en fonction de votre configuration, Maven vérifiera les dernières modifications sur une dépendance particulière. La capture instantanée est instable car elle est en cours de développement, mais si un projet spécial doit comporter les dernières modifications, vous devez configurer la version de votre dépendance pour la version de la capture instantanée. Ce scénario se produit dans les grandes organisations proposant plusieurs produits liés étroitement entre eux.