1017 votes

Qu'est-ce qu'un Maven Snapshot exactement et pourquoi en avons-nous besoin ?

Je suis un peu confus sur la signification d'un Instantané Maven et pourquoi nous en construisons un?

1213voto

Joachim Sauer Points 133411

Une version snapshot dans Maven est une version qui n'a pas encore été publiée.

L'idée est que avant une publication 1.0 (ou toute autre publication), il existe une version 1.0-SNAPSHOT. Cette version est ce qui pourrait devenir 1.0. C'est essentiellement "1.0 en cours de développement". Cela peut être proche d'une véritable publication 1.0, ou assez loin (juste après la publication 0.9, par exemple).

La différence entre une version "réelle" et une version snapshot est que les snapshots peuvent être mis à jour. Cela signifie que télécharger 1.0-SNAPSHOT aujourd'hui peut donner un fichier différent de celui téléchargé hier ou demain.

En général, les dépendances sur des snapshots devraient uniquement exister pendant le développement et aucune version publiée (c'est-à-dire aucune version non snapshot) ne devrait avoir une dépendance sur une version snapshot.

0 votes

Donc le snapshot est toujours une version plus stable, je suppose. Et ce numéro de version concerne uniquement laquelle des versions d'artefacts à utiliser et non une branche différente du code source, est-ce correct?

75 votes

@amphibient : Non, le snapshot n'est pas nécessairement plus stable : c'est juste la dernière version. Le snapshot précède la sortie officielle, il ne vient pas après. En effet, les numéros de version ne font généralement pas référence aux branches.

9 votes

@avandeursen les instantanés n'ont pas nécessairement les sémantiques que vous revendiquez. Vous pouvez avoir "master-SNAPSHOT" et plus tard faire une version 1.0. Il n'est pas nécessaire que ce soit "FutureVersion-SNAPSHOT" et cela ne précède pas nécessairement une version. Tout le reste est cependant correct - c'est une référence instable à une cible mouvante et ne peut pas être utilisée pour produire une compilation reproductible.

898voto

romaintaz Points 32120

Les trois autres réponses vous donnent une bonne vision de ce qu'est une version -SNAPSHOT. Je voulais juste ajouter quelques informations concernant le comportement de Maven lorsqu'il trouve une dépendance SNAPSHOT.

Lorsque vous construisez une application, Maven recherchera les dépendances dans le dépôt local. Si une version stable n'est pas trouvée là-bas, il recherchera les dépôts distants (définis dans settings.xml ou pom.xml) pour récupérer cette dépendance. Ensuite, il la copiera dans le dépôt local, pour la rendre disponible pour les prochains builds.

Par exemple, une bibliothèque foo-1.0.jar est considérée comme une version stable, et si Maven la trouve dans le dépôt local, il l'utilisera pour la construction en cours.

Maintenant, si vous avez besoin d'une bibliothèque foo-1.0-SNAPSHOT.jar, Maven saura que cette version n'est pas stable et est sujette à des changements. C'est pourquoi Maven essaiera de trouver une version plus récente dans les dépôts distants, même si une version de cette bibliothèque est trouvée dans le dépôt local. Cependant, cette vérification n'est faite 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 6 mai 2011 à 11h00) dans votre dépôt local, et si vous lancez à nouveau la construction Maven le même jour, Maven ne vérifiera pas les dépôts pour une version plus récente.

Maven vous propose un moyen de changer cette politique de mise à jour dans la définition de votre dépôt :

    foo-repository
    ...

        true
        XXX

XXX peut être :

  • toujours : Maven vérifiera une nouvelle version à chaque construction ;
  • quotidiennement, la valeur par défaut ;
  • interval:XXX : un intervalle en minutes (XXX) ;
  • jamais : Maven ne tentera jamais de récupérer une autre version. Il le fera seulement s'il n'existe pas localement. Avec cette configuration, les versions SNAPSHOT seront traitées comme les bibliothèques stables.

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

3 votes

Il semble que l'on puisse utiliser un commutateur en ligne de commande pour forcer Maven à télécharger de nouveau toutes les versions SNAPSHOT : mvn clean package -U comme indiqué dans ce tutoriel Maven

3 votes

Faites attention au drapeau -U. Il pourrait ne pas faire ce que vous attendez en raison de MNG-4142.

4 votes

Il est également important de mentionner que la bonne pratique recommande de ne pas utiliser de dépendances instantanées lors de la création d'une version de publication. En effet, le plugin Maven Release échouera s'il y a des dépendances instantanées présentes.

88voto

jjnguy Points 62123

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 pleine développement.

Lorsque le code est prêt et qu'il est temps de le publier, vous voudrez changer la version répertoriée dans le POM. Alors, au lieu d'avoir un "SNAPSHOT", vous utiliseriez un label comme "1.0".

Pour obtenir de l'aide sur la gestion des versions, consultez la spécification de Versionnement Sémantique.

1 votes

En termes de versionnage sémantique, une version -SNAPSHOT serait une pré-version : "Une version préliminaire indique que la version est instable et peut ne pas satisfaire les exigences de compatibilité prévues telles que définies 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."

3 votes

Il me semble que "SNAPSHOT" n'est pas une "capture de votre code à un moment spécifique", mais plutôt "la dernière version du code disponible". Si cela était HTTP, ce serait le drapeau qui dit : "N'essayez pas une requête HEAD, allez simplement obtenir ce qui est sur le serveur de toute façon". En effet, c'est presque l'opposé "du code à un moment donné".

1 votes

Qu'est-ce que le développement "lourd"?

43voto

Peter Lawrey Points 229686

Une "version" est la construction finale d'une version qui ne change pas.

Un "instantané" est une construction qui peut être remplacée par une autre construction portant le même nom. Cela implique que la construction pourrait changer à tout moment et est toujours en développement actif.

Vous avez différents artefacts pour différentes constructions 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. ;)

7voto

Kati Holasz Points 11

C'est ainsi qu'apparaît un instantané pour un dépôt et dans ce cas, il n'est pas activé, ce qui signifie que le dépôt mentionné ici est stable et qu'il n'y a pas besoin de mises à jour.

    ...

            lds-main
            Répertoire principal de LDS
            http://code.lds.org/nexus/content/groups/main-repo

                false

Un autre cas serait pour:

        true

ce qui signifie que Maven recherchera des mises à jour pour ce dépôt. Vous pouvez également spécifier un intervalle pour les mises à jour avec la balise.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X