761 votes

Comment puis-je dire Maven à utiliser la dernière version d’une dépendance ?

<p>Dans Maven, les dépendances sont généralement mis en place comme ceci :<pre class="lang-xml prettyprint-override"><code></code></pre><p>Maintenant, si vous utilisez des bibliothèques qui sont souvent rejetées, constamment mise à jour de la balise < version > peut être un peu ennuyeux. Est-il possible de dire à Maven de toujours utiliser la dernière version disponible (à partir du référentiel) ?</p></p>

724voto

Rich Seller Points 46052

Si vous souhaitez toujours utiliser la version la plus récente, Maven a deux mots clés que vous pouvez utiliser comme une alternative à la version plages. Vous devez utiliser ces options avec soin car vous n'êtes plus dans le contrôle de l'plugins/dépendances que vous utilisez.

Lorsque vous dépendez d'un plugin ou d'une dépendance, vous pouvez utiliser la version de la valeur de la DERNIÈRE ou de la LIBÉRATION. DERNIER fait référence à la dernière version ou la version de capture instantanée d'un artefact, le plus récemment déployé artefact dans un référentiel spécifique. COMMUNIQUÉ de se réfère à la dernière non instantané de la version dans le dépôt. En général, il n'est pas des meilleures pratiques de conception de logiciels qui dépend d'un non-version spécifique d'un objet. Si vous êtes en développement logiciel, vous pouvez utiliser la LIBÉRATION ou de la DERNIÈRE commodité de sorte que vous n'avez pas à mettre à jour les numéros de version quand une nouvelle version d'une bibliothèque tierce, est libéré. Lorsque vous relâchez le logiciel, vous devriez toujours vous assurer que votre projet dépend des versions spécifiques pour réduire les chances de votre construction ou de votre projet d'être affecté par une version de logiciel pas sous votre contrôle. Utiliser la DERNIÈRE et la LIBÉRATION avec prudence, si.

Voir les POM section Syntaxe de l'Maven livre pour plus de détails.

Voici un exemple illustrant les différentes options. Dans le repository Maven, com.toto:mon-foo a les métadonnées suivantes:

<?xml version="1.0" encoding="UTF-8"?><metadata>
  <groupId>com.foo</groupId>
  <artifactId>my-foo</artifactId>
  <version>2.0.0</version>
  <versioning>
    <release>1.1.1</release>
    <versions>
      <version>1.0</version>
      <version>1.0.1</version>
      <version>1.1</version>
      <version>1.1.1</version>
      <version>2.0.0</version>
    </versions>
    <lastUpdated>20090722140000</lastUpdated>
  </versioning>
</metadata>

Si une dépendance sur cet artefact est nécessaire, vous avez les options suivantes (autre version plages peuvent être spécifiés bien sûr, il suffit de montrer ceux qui sont pertinents ici):

Déclarer une version exacte (toujours résoudre à 1.0.1):

<version>[1.0.1]</version>

Déclarer explicitement une version (toujours résoudre à 1.0.1, sauf si une collision se produit, lorsque Maven va sélectionner une version correspondante):

<version>1.0.1</version>

Déclarer une version de la gamme pour tous 1.x (actuellement à résoudre pour 1.1.1):

<version>[1.0.0,2.0.0)</version>

Déclarer ouverte la version de la gamme (résoudre 2.0.0):

<version>[1.0.0,)</version>

Déclarer la version la plus récente (résoudre 2.0.0):

<version>LATEST</version>

Déclarer la version RELEASE (résoudra 1.1.1):

<version>RELEASE</version>

Notez que par défaut, votre propre déploiement de la mise à jour de la "dernière" entrée dans le Maven métadonnées, mais à la mise à jour de la "libération" de l'entrée, vous devez activer le "profil" de l' Maven super POM. Vous pouvez le faire avec "-Prelease-profil" ou "-DperformRelease=true"


Il est intéressant de souligner que toute approche qui permet de Maven pour choisir la dépendance versions (plus tard, à la LIBÉRATION, et la version plages) peut vous laisser ouvert à construire des problèmes de temps, comme plus tard les versions peuvent avoir des comportements différents (par exemple la dépendance plugin a déjà basculé une valeur par défaut de true à false, avec confusion des résultats).

Par conséquent, il est généralement une bonne idée de définir exacte de versions en versions. Comme Tim la réponse de points, le maven-versions-plugin est un outil pratique pour la mise à jour de la dépendance versions, en particulier les versions:utilisez-les dernières versions et versions:utilisez-les dernières versions des objectifs.

370voto

Tim Points 8971

Maintenant, je sais que ce sujet est vieux, mais la lecture de la question et l'OP fourni de réponse, il semble que les Versions de Maven Plugin ont effectivement été une meilleure réponse à sa question:

  • Les Versions Plugin a les objectifs suivants:
    • versions:affichage de la dépendance à des mises à jour de l'analyse d'un projet de dépendances et produit un rapport de ces dépendances plus récentes versions disponibles.
    • versions:affichage-plugin-mises à jour de l'analyse d'un projet de plugins et produit un rapport de ces plugins qui ont des versions plus récentes disponibles.
    • versions:mise à jour-parent mises à jour de la section parent d'un projet afin de qu'il fait référence à la plus récente version disponible. Par exemple, si vous utilisez une entreprise de la racine POM, ce l'objectif peut être utile si vous avez besoin de assurez-vous d'utiliser la dernière la version de l'entreprise racine POM.
    • versions:mise à jour-propriétés des mises à jour des propriétés définies dans un projet pour qu'ils correspondent à la dernière version de l' dépendances spécifiques. Cela peut être utile si une suite de dépendances doivent tous être verrouillé pour une version.
    • versions:mise à jour-enfant-modules de mises à jour de la section parent de l' enfant les modules d'un projet de sorte que le version correspond à la version de l' projet en cours. Par exemple, si vous ont un agrégateur pom qui est également le parent pour les projets qu'il les agrégats et les enfants et parent versions sortir de la synchronisation, ce mojo peut aider à résoudre les versions de la enfant modules. (Veuillez noter que vous devez invoquer Maven avec l'option-N dans afin d'exécuter ce but si votre le projet est cassé si mal que ça ne peut pas se construire à cause de la version mis-match).
    • versions:le verrouillage des instantanés de recherche dans le pom pour tous -INSTANTANÉ les versions et les remplace par le timestamp actuelle version de l' -INSTANTANÉ, par exemple -20090327.172306-4
    • versions:déverrouillez-les instantanés de recherche dans le pom pour tous les timestamp verrouillé instantané et remplace les versions avec -INSTANTANÉ.
    • versions:résoudre les-plages trouve les dépendances à l'aide de la version plages et résout la gamme spécifique la version utilisée.
    • versions:utilisez-les communiqués de recherche dans le pom pour tous -INSTANTANÉ versions qui ont été libérés et remplace avec la version correspondante version.
    • versions:utilisez-next-communiqués de recherche dans le pom pour tous les non-INSTANTANÉ les versions qui ont été une nouvelle la libération et les remplace par le la prochaine version.
    • versions:utilisez-les dernières versions des recherches de la pom pour tous les non-INSTANTANÉ les versions qui ont été une nouvelle la libération et les remplace par le dernière version.
    • versions:utilisez-les prochaines versions de recherches de la pom pour toutes les versions qui ont été une version plus récente et remplace avec la prochaine version.
    • versions:utilisez-les dernières versions des recherches de la pom pour toutes les versions qui ont été une version plus récente et remplace avec la dernière version.
    • versions:s'engager supprime le pom.xml.versionsBackup fichiers. Les formes la moitié de l'intégré dans le "Pauvre Homme SCM".
    • versions:revenir restaure l'pom.xml les fichiers de la pom.xml.versionsBackup fichiers. Les formes la moitié de l'intégré dans le "Pauvre Homme SCM".

Juste pensé que je pourrais l'inclure pour toute référence future.

169voto

Martin Klinke Points 4157

Veuillez jeter un oeil à cette page (paragraphe "Dépendance Version des Plages"). Ce que vous pouvez faire est quelque chose comme

<version>[1.2.3,)</version>

HTH

Edit: Viens de voir la note que les idées exprimées dans le document lié ne peut pas encore être mis en œuvre...

Edit 2: La version plages sont mis en œuvre dans Maven2.

VEUILLEZ NOTER: @AndersSandvig envisagez de changer la accepté de répondre à un autre que le mien. Maintenant, je vous suggère d'aller pour les versions plugin, voir Tim réponse.

80voto

Adam Gent Points 15055

Contrairement à d'autres, je pense qu'il y a de nombreuses raisons pour lesquelles vous pourriez vouloir toujours la dernière version. En particulier si vous effectuez un déploiement continu (nous avons parfois comme 5 versions en une journée) et ne veux pas faire un multi-projet de module.

Ce que je fais, c'est de faire Hudson/Jenkins, effectuez les opérations suivantes pour chaque version:

mvn clean versions:use-latest-versions scm:checkin deploy -Dmessage="update versions" -DperformRelease=true

C'est-je utiliser les versions plugin et scm plugin pour mettre à jour les dépendances, puis le vérifier à la source. Oui, j'ai laissé mes CI ne SCM archivages (ce que vous avez à faire de toute façon pour la version plugin maven).

Vous aurez envie de configuration les versions plugin pour mettre à jour uniquement ce que vous voulez:

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>1.2</version>
            <configuration>
                <includesList>com.snaphop</includesList>
                <generateBackupPoms>false</generateBackupPoms>
                <allowSnapshots>true</allowSnapshots>
            </configuration>
        </plugin>

J'utilise la version plugin pour faire la version qui prend soin de l'INSTANTANÉ et valide qu'il y a une version de capture d'écran (ce qui est important).

Si vous faites ce que je fais, vous obtiendrez la version la plus récente de tous les clichés de construit et la dernière version de release. Vos builds vont également être reproductible.

15voto

Martin Klinke Points 4157
<p>Vous êtes peut-être selon les versions de développement qui évidemment changent beaucoup au cours du développement ?</p> <p>Au lieu d’incrémenter la version des versions de développement, vous pouvez simplement utiliser une version de capture instantanée que vous écraser lorsque cela est nécessaire, ce qui signifie que vous n’auriez pas de changer la version tag sur chaque modification mineure. Quelque chose comme 1,0-instantané...</p> <p>Mais peut-être que vous essayez de réaliser quelque chose d’autre  ;)</p>

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