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


Je suis un peu confus au sujet de la signification d'un instantané Maven et pourquoi nous en construisons un?


641
2018-05-05 16:50


origine


Réponses:


Une version d'instantané dans Maven est celle qui n'a pas été libérée.

L'idée est que avant une 1.0 libération (ou toute autre version) est fait, il existe un 1.0-SNAPSHOT. Cette version est ce que pourrait devenir  1.0. C'est fondamentalement "1.0 en développement ".Cela pourrait être Fermer à un vrai 1.0 sortie, ou assez loin (juste après la 0.9 libération, 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 le téléchargement 1.0-SNAPSHOT aujourd'hui pourrait donner un fichier différent que de le télécharger hier ou demain.

Habituellement, les dépendances de snapshot devraient seulement existe au cours du développement et aucune version publiée (c'est-à-dire aucune image non instantanée) ne doit avoir de dépendance sur une version d'instantané.


738
2018-05-05 16:57



Les trois autres réponses vous donnent une bonne idée de ce que -SNAPSHOT la version est. Je voulais juste ajouter quelques informations concernant le comportement de Maven quand il trouve un SNAPSHOT dépendance.

Lorsque vous générez une application, Maven recherche les dépendances dans le local dépôt. Si une version stable n'y est pas trouvée, elle recherchera les dépôts distants (définis dans settings.xml ou pom.xml) pour récupérer cette dépendance. Ensuite, il va le copier dans le dépôt local, pour le rendre disponible pour les prochaines versions.

Par exemple, un foo-1.0.jar la bibliothèque est considérée comme stable version, et si Maven le trouve dans le dépôt local, il utilisera celui-ci pour la version actuelle.

Maintenant, si vous avez besoin d'un foo-1.0-SNAPSHOT.jar Bibliothèque, Maven saura que cette version n'est pas stable et est sujette à des changements. C'est pourquoi Maven va essayer 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 sur le dépôt local. Cependant, cette vérification est effectuée une seule 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 dépôt local, et si vous lancez le build Maven le même jour, Maven ne pas vérifiez les dépôts pour une version plus récente.

Maven vous fournit un moyen de changer cette politique 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>

XXX peut être:

  • toujours: Maven vérifiera une version plus récente sur chaque build;
  • du quotidien, 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 le fera seulement s'il n'existe pas localement. Avec la configuration, SNAPSHOT la version sera traitée comme les bibliothèques stables.

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


663
2018-05-06 06:41



Le terme "SNAPSHOT" signifie que la construction est un instantané de votre code à un moment donné.

Cela signifie généralement que la version est encore en cours de développement.

Quand vient le temps de libérer votre code, vous voudrez changer la version listée dans le pom. Donc, au lieu d'avoir un "SNAPSHOT" vous auriez quelque chose comme "1.0".

Pour de l'aide avec le versioning, consultez le Spécification de la version sémantique.


50
2018-05-05 16:55



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

Un "snapshot" est une construction qui peut être remplacée par une autre qui a le même nom. Cela implique que la construction pourrait changer à tout moment et est encore 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. Généralement c'est plus simple d'avoir une construction qui fait tout ce dont vous avez besoin. ;)


20
2018-05-05 16:54



Les versions Maven peuvent contenir une chaîne littérale "SNAPSHOT" pour indiquer qu'un projet est actuellement en développement actif.

Par exemple, si votre projet possède 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 à 23h08 le 7 février 2008 UTC. En d'autres termes, quand vous déployer un instantané, vous ne faites pas de version d'un composant logiciel; tu es libérer un instantané d'un composant à un moment précis.

Ainsi, les versions de snapshot sont principalement utilisées pour les projets en développement actif. Si votre projet dépend d'un composant logiciel en cours de développement, vous pouvez compter sur une version d'instantané, et Maven tentera périodiquement pour télécharger le dernier instantané à 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 va avoir une version "1.8", votre projet serait avoir une version "1.8-SNAPSHOT" jusqu'à sa publication officielle.

Par exemple, la dépendance suivante télécharge toujours le dernier JAR de développement du 1.8:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>1.8-SNAPSHOT”</version>
    </dependency>

Maven

Un exemple de processus de libération de Maven

enter image description here


7
2017-07-13 13:46



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


3
2017-12-02 12:08



habituellement à Maven nous avons deux types de constructions 1) Constructions d'instantanés 2) Libérer les builds

  1. snapshot builds: SNAPSHOT est la version spéciale qui indique la copie de déploiement actuelle pas comme une version normale, maven vérifie la version de chaque build dans le référentiel distant les builds de snapshots ne sont donc rien d'autre que des builds de maintenance.

  2. Release builds: Release signifie supprimer le SNAPSHOT à la version de la build, ce sont les versions de build habituelles.


1
2017-08-08 07:14