Qu'est-ce qu'un instantané Maven et pourquoi en avons-nous besoin?

851

Je suis un peu confus quant à la signification d'un instantané Maven et pourquoi nous en construisons un?

meisam
la source

Réponses:

1013

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.0version (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.0cours de développement". Cela pourrait être proche d'une vraie 1.0version, ou assez loin (juste après la 0.9sortie, 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-SNAPSHOTaujourd'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é.

Joachim Sauer
la source
67
@amphibient: Non, le cliché n'est pas nécessairement plus stable: ce n'est que la dernière version. L'instantané précède la sortie réelle, il ne vient pas après. En effet, les numéros de version ne font généralement pas référence à des branches.
avandeursen
9
Les instantanés @avandeursen n'ont pas nécessairement la sémantique que vous revendiquez. Vous pouvez avoir "master-SNAPSHOT" et faire plus tard une version 1.0. il ne doit pas nécessairement être "FutureVersion-SNAPSHOT", ni nécessairement précéder une publication. Cependant, tout le reste est correct - c'est une référence instable à une cible en mouvement et ne peut pas être invoqué pour produire une construction reproductible.
Scott Carey
3
Merci @ScottCarey. «Précède couramment» serait probablement plus précis, car il n'y a même aucune garantie que la «cible mobile» existerait à terme.
avandeursen
1
@Jay: non, pour autant que je sache qu'il n'y a aucun moyen de référencer explicitement un INSTANTANÉ spécifique, ils ne sont pas adressables / interchangeables par conception. Si vous avez besoin d'une version à granularité fine, vous devez simplement libérer les versions candidates avec des chaînes de version spécifiques (-RC1, -RC2 ou quelque chose comme ça).
Joachim Sauer
14
Pourquoi ne peuvent-ils pas simplement l'appeler " 1.0-DEVELOPMENT", ou comme " 1.0-INPROGRESS", pourquoi les gens doivent-ils utiliser des termes non évidents
uh_big_mike_boi
792

Les trois autres réponses vous donnent une bonne vision de ce qu'est une -SNAPSHOTversion. Je voulais juste ajouter quelques informations concernant le comportement de Maven quand il trouve une SNAPSHOTdé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.xmlou 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.jarbibliothè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.jarbibliothè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>

XXXpeut être:

  • toujours : Maven recherchera une version plus récente sur chaque build;
  • quotidiennement , la valeur par défaut;
  • intervalle: XXX : un intervalle en minutes (XXX)
  • jamais : Maven n'essaiera jamais de récupérer une autre version. Il ne le fera que s'il n'existe pas localement. Avec la configuration, la SNAPSHOTversion sera gérée comme les bibliothèques stables.

(le modèle du fichier settings.xml peut être trouvé ici)

Romain Linsolas
la source
2
Il semble qu'il soit possible d'utiliser un commutateur de ligne de commande pour forcer maven à retélécharger toutes les SNAPSHOTversions: mvn clean package -Uselon le tutoriel maven
Dimitry K
3
Attention au -Udrapeau. Il pourrait ne pas faire ce que vous attendez du MNG-4142 .
Kevin Cross
3
Il convient également de mentionner que les bonnes pratiques exigent que vous n'utilisiez aucune dépendance de capture instantanée lorsque vous venez de créer une version de version, et en effet le plug-in de libération Maven échouera s'il existe des dépendances de capture instantanée.
RCross
2
J'ai couru mvn installpour 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 installil 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 installaprès l'avoir modifiée ?
Don Cheadle
1
@mmcrae AFAIK il devrait être mis à jour. C'est ce que l' objectif d' installation fait, la mise à jour des bocaux SNAPSHOT locaux. Avez-vous découvert autre chose?
Johnny
73

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 .

jjnguy
la source
En termes de version sémantique , une version -SNAPSHOT serait une pré-version: " Une version pré-version indique que la version est instable et peut ne pas satisfaire aux exigences de compatibilité prévues comme indiqué par sa version normale associée. Exemples: 1.0.0 -alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92. "
avandeursen
3
Il me semble que «INSTANTANÉ» n'est pas un «instantané de votre code à un moment précis» mais plutôt «la dernière version du code disponible». Si c'était HTTP, ce serait le drapeau qui dit: "Ne vous embêtez pas à faire un HEAD, allez chercher tout ce qui se trouve sur le serveur." En effet, c'est presque le «code à un moment donné» opposé.
lilbyrdie
Qu'est-ce qu'un développement "lourd"?
Joker
1
@Joker "heavy", c'est quand beaucoup de choses changent (nouvelles fonctionnalités, refactoring etc.)
robert
28

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

Peter Lawrey
la source
21

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>

Maven

Un exemple de processus de libération de Maven

entrez la description de l'image ici

Joby Wilson Mathews
la source
6

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 -SNAPSHOTmais 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.4comme 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.4est 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.5est 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).
Garret Wilson
la source
Avez-vous des informations sur la façon dont maven gère les métadonnées de construction ou les conventions de dénomination pré-version? Je veux dire, nous savons tous que l'alfa précède la bêta, mais est-ce que maven le sait? Même s'il prend 1.2.3-beta.4 comme version stable, sait-il au moins que 1.2.3 est APRÈS?
DGoiko
5

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.

Kati Holasz
la source
5

généralement dans maven, nous avons deux types de builds 1) Builds Snapshot 2) Release builds

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

  2. Release builds: Release signifie supprimer le SNAPSHOT à la version de la build, ce sont les versions de build régulières.

Venky Vungarala
la source
3

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

shanika prasangika
la source
1

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.

CCNA
la source
1

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.

Mahdi Soltani
la source
0

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.

Sourabh Bhavsar
la source