Réponses:
Une version instantanée de Maven est une version qui n'a pas été publiée.
L'idée est qu'avant qu'une 1.0
version (ou toute autre version) soit effectuée, il existe un 1.0-SNAPSHOT
. Cette version est ce qui pourrait devenir 1.0
. C'est essentiellement "en 1.0
cours de développement". Cela pourrait être proche d'une vraie 1.0
version, ou assez loin (juste après la 0.9
sortie, par exemple).
La différence entre une "vraie" version et une version d'instantané est que les instantanés peuvent obtenir des mises à jour. Cela signifie que le téléchargement d' 1.0-SNAPSHOT
aujourd'hui peut donner un fichier différent de celui d'hier ou de demain.
Habituellement, les dépendances de cliché ne devraient exister que pendant le développement et aucune version publiée (c'est-à-dire pas de non-cliché) ne devrait avoir de dépendance sur une version de cliché.
1.0-DEVELOPMENT
", ou comme " 1.0-INPROGRESS
", pourquoi les gens doivent-ils utiliser des termes non évidents
Les trois autres réponses vous donnent une bonne vision de ce qu'est une -SNAPSHOT
version. Je voulais juste ajouter quelques informations concernant le comportement de Maven quand il trouve une SNAPSHOT
dépendance.
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, il recherchera les référentiels distants (définis dans settings.xml
ou pom.xml
) pour récupérer cette dépendance. Ensuite, il le copiera dans le référentiel local, pour le rendre disponible pour les prochaines générations.
Par exemple, une foo-1.0.jar
bibliothèque 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.
Maintenant, si vous avez besoin d'une foo-1.0-SNAPSHOT.jar
bibliothèque, Maven saura que cette version n'est pas stable et est sujette à modifications. 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 sur le référentiel local. Cependant, cette vérification n'est effectuée qu'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 construction Maven le même jour, Maven ne vérifiera pas les référentiels pour une version plus récente.
Maven vous offre un moyen de modifier cette stratégie de mise à jour dans votre définition de référentiel:
<repository>
<id>foo-repository</id>
<url>...</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>XXX</updatePolicy>
</snapshots>
</repository>
où XXX
peut être:
SNAPSHOT
version sera gérée comme les bibliothèques stables.(le modèle du fichier settings.xml peut être trouvé ici)
SNAPSHOT
versions: mvn clean package -U
selon le tutoriel maven
-U
drapeau. Il pourrait ne pas faire ce que vous attendez du MNG-4142 .
mvn install
pour installer un pot de version 1.0-SNAPSHOT dans mon dépôt local. Le lendemain, j'ai apporté des modifications au projet, mais je n'ai pas changé la version - puis lors de l'exécution, mvn install
il ne semblait pas le changer dans mon référentiel local. Est-ce un comportement attendu? Puis-je ne pas réutiliser une version et l'écraser mvn install
après l'avoir modifiée ?
Le terme «INSTANTANÉ» signifie que la construction est un instantané de votre code à un moment donné.
Cela signifie généralement que cette version est encore en cours de développement.
Lorsque le code est prêt et qu'il est temps de le publier, vous souhaiterez changer la version répertoriée dans le POM. Ensuite, au lieu d'avoir un "INSTANTANÉ", vous utiliseriez une étiquette comme "1.0".
Pour obtenir de l'aide sur le contrôle de version, consultez la spécification du contrôle de version 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 version portant le même nom. Cela implique que la version pourrait changer à tout moment et est toujours en cours de développement actif.
Vous avez différents artefacts pour différentes versions basées sur le même code. Par exemple, vous pouvez en avoir un avec débogage et un sans. Un pour Java 5.0 et un pour Java 6. Généralement, il est plus simple d'avoir un build qui fait tout ce dont vous avez besoin. ;)
Les versions de Maven peuvent contenir une chaîne littérale "INSTANTANÉ" pour signifier qu'un projet est actuellement en développement actif.
Par exemple, si votre projet a une version de «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 deviez déployer une version à 11 : 08 h 00 le 7 février 2008 UTC. En d'autres termes, lorsque vous déployez un instantané, vous n'effectuez pas de version d'un composant logiciel; vous publiez un instantané d'un composant à un moment précis.
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 dépendre d'une version de capture instantanée et Maven tentera périodiquement de télécharger la dernière capture instantanée à partir d'un référentiel lorsque vous exécutez une génération. De même, si la prochaine version de votre système doit avoir une version «1.8», votre projet aura une version «1.8-SNAPSHOT» jusqu'à sa sortie officielle.
Par exemple, la dépendance suivante téléchargerait toujours le dernier 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
Je voudrais faire une remarque sur la terminologie. Les autres réponses ont donné de bonnes explications sur ce qu'est une version "instantané" dans le contexte de Maven. Mais en résulte-t-il qu'une version non instantanée doit être qualifiée de version "release"?
Il y a une certaine tension entre l'idée de versioning sémantique d'une version "release", qui semble être toute version qui n'a pas de qualificatif tel que -SNAPSHOT
mais n'a pas non plus de qualificatif tel que -beta.4
; et l'idée de 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 quant à savoir si «version» signifie «nous pouvons le publier sur Maven Central» ou «le logiciel est dans sa version finale au public». Nous pourrions considérer -beta.4
comme une version "release" si nous la publions, mais ce n'est pas une "version finale". Le versioning sémantique indique clairement que quelque chose comme -beta.4
est une version "pré-release", donc cela n'aurait aucun sens d'être appelé une version "release", même sans -SNAPSHOT
. En fait, par définition, même -rc.5
est une version candidate , pas une version réelle, même si nous pouvons autoriser l'accès du public aux tests.
Donc, Maven nonobstant, à mon avis, il semble plus approprié d'appeler uniquement une version "de sortie" qui n'a aucun qualificatif du tout, même pas -beta.4
. Peut-être qu'un meilleur nom pour une version non instantanée de Maven serait une version "stable" (inspirée d' une autre réponse ). Ainsi nous aurions:
1.2.3-beta.4-SNAPSHOT
: Une version instantanée d'une version préliminaire.1.2.3-SNAPSHOT
: Une version instantanée d'une version finale.1.2.3-beta.4
: Une version stable d'une version préliminaire.1.2.3
: Une version finale (qui est une version stable et non instantanée, évidemment).Voici à quoi ressemble un instantané pour un référentiel et dans ce cas n'est pas activé, ce qui signifie que le référentiel mentionné ici est stable et qu'il n'y a pas besoin de mises à jour.
<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 la balise.
généralement dans maven, nous avons deux types de builds 1) Builds Snapshot 2) Release builds
builds de snapshots: SNAPSHOT est la version spéciale qui indique la copie de déploiement actuelle pas comme une version régulière, maven vérifie la version pour chaque build dans le référentiel distant afin que les builds de snapshots ne soient que des builds de développement.
Release builds: Release signifie supprimer le SNAPSHOT à la version de la build, ce sont les versions de build régulières.
simplement un instantané signifie que c'est la version qui n'est pas stable.
lorsque la version inclut un instantané comme 1.0.0 -SNAPSHOT signifie que ce n'est pas une version stable et recherchez un référentiel distant pour résoudre les dépendances
comprendre le contexte de SDLC aidera à comprendre la différence entre l'instantané et la version. Pendant le processus de développement, les développeurs contribuent tous leurs fonctionnalités à une branche de base. À un moment donné, le responsable pense que suffisamment de fonctionnalités se sont accumulées, puis il coupera une branche de publication de la branche de base. Toutes les versions antérieures à ce point temporel sont des instantanés. Les versions publiées à ce stade sont des versions. Notez que les versions de la version peuvent également changer avant de passer en production en cas de défaut pendant le test de version.
Un instantané signifie simplement qu'en fonction de votre configuration, Maven vérifiera les dernières modifications sur une dépendance spéciale. Le snapshot est instable car il est en cours de développement mais si un projet spécial doit avoir les dernières modifications, vous devez configurer votre version de dépendance en version snapshot. Ce scénario se produit dans les grandes organisations avec plusieurs produits que ces produits sont étroitement liés.
Comme son nom l'indique, l'instantané fait référence à un état de projet et à ses dépendances à ce moment. Chaque fois que maven trouve un INSTANTANÉ plus récent du projet, il télécharge et remplace l'ancien fichier .jar du projet dans le référentiel local.
Les versions instantanées sont 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 dépendre d'une version de capture instantanée et Maven tentera périodiquement de télécharger la dernière capture instantanée à partir d'un référentiel lorsque vous exécutez une génération.