Dans Maven, les dépendances sont généralement configurées comme suit:
<dependency>
<groupId>wonderful-inc</groupId>
<artifactId>dream-library</artifactId>
<version>1.2.3</version>
</dependency>
Maintenant, si vous travaillez avec des bibliothèques qui ont des versions fréquentes, la mise à jour constante de la balise <version> peut être quelque peu ennuyeuse. Existe-t-il un moyen de dire à Maven de toujours utiliser la dernière version disponible (à partir du référentiel)?
java
maven
dependencies
maven-2
maven-metadata
Anders Sandvig
la source
la source
Réponses:
REMARQUE:
Cette réponse s'applique uniquement à Maven 2! Les métaversions mentionnées
LATEST
et ont été supprimées dans Maven 3 "pour des constructions reproductibles" , il y a plus de 6 ans. Veuillez vous référer à cette solution compatible Maven 3RELEASE
.Si vous souhaitez toujours utiliser la version la plus récente, Maven dispose de deux mots clés que vous pouvez utiliser comme alternative aux plages de versions. Vous devez utiliser ces options avec précaution car vous ne contrôlez plus les plugins / dépendances que vous utilisez.
Voir la section Syntaxe POM du livre Maven pour plus de détails. Ou consultez ce document sur les plages de versions des dépendances , où:
[
&]
) signifie "fermé" (inclus).(
&)
) signifie "ouvert" (exclusif).Voici un exemple illustrant les différentes options. Dans le référentiel Maven, com.foo:my-foo contient les métadonnées suivantes:
Si une dépendance à cet artefact est requise, vous disposez des options suivantes (d'autres gammes de versions peuvent être spécifiées bien sûr, en affichant simplement celles pertinentes ici):
Déclarez une version exacte (sera toujours résolue en 1.0.1):
Déclarez une version explicite (sera toujours résolue en 1.0.1 sauf si une collision se produit, lorsque Maven sélectionnera une version correspondante):
Déclarez une plage de versions pour tous les 1.x (se résoudra actuellement en 1.1.1):
Déclarez une plage de versions ouverte (résoudra en 2.0.0):
Déclarez la version comme DERNIÈRE (résoudra en 2.0.0) (supprimée de maven 3.x)
Déclarez la version comme RELEASE (résoudra en 1.1.1) (supprimée de maven 3.x):
Notez que par défaut, vos propres déploiements mettront à jour la "dernière" entrée dans les métadonnées Maven, mais pour mettre à jour l'entrée "release", vous devez activer le "release-profile" à partir du super POM Maven . Vous pouvez le faire avec "-Prelease-profile" ou "-DperformRelease = true"
Il convient de souligner que toute approche qui permet à Maven de choisir les versions de dépendance (LATEST, RELEASE et plages de versions) peut vous laisser ouvert pour créer des problèmes de temps, car les versions ultérieures peuvent avoir un comportement différent (par exemple, le plug-in de dépendance a précédemment changé de valeur par défaut). valeur de vrai à faux, avec des résultats confus).
C'est donc généralement une bonne idée de définir des versions exactes dans les versions. Comme le souligne la réponse de Tim , le plugin maven-versions- est un outil pratique pour mettre à jour les versions de dépendance, en particulier les versions: use-latest-versions et versions: use-latest-releases objectives.
la source
[1.1,2.0)
Maintenant, je sais que ce sujet est ancien, mais à la lecture de la question et de la réponse fournie par l'OP, il semble que le plugin Maven Versions aurait pu être une meilleure réponse à sa question:
En particulier, les objectifs suivants pourraient être utiles:
Les autres objectifs suivants sont également fournis:
Je pensais juste l'inclure pour toute référence future.
la source
Veuillez consulter cette page (section "Plages de versions des dépendances"). Ce que vous pourriez vouloir faire, c'est quelque chose comme
Ces gammes de versions sont implémentées dans Maven2.
la source
mvn dependency:tree -Dverbose
de comprendre cela. Cela pourrait expliquer la version inattendue.Contrairement à d'autres, je pense qu'il existe de nombreuses raisons pour lesquelles vous pouvez toujours vouloir la dernière version. Surtout si vous faites un déploiement continu (nous avons parfois comme 5 versions en une journée) et que vous ne voulez pas faire un projet multi-modules.
Ce que je fais, c'est que Hudson / Jenkins fasse ce qui suit pour chaque build:
C'est-à-dire que j'utilise le plugin versions et le plugin scm pour mettre à jour les dépendances, puis les archiver dans le contrôle de code source. Oui, je laisse mon CI effectuer des vérifications SCM (ce que vous devez faire de toute façon pour le plugin de libération maven).
Vous voudrez configurer le plugin des versions pour ne mettre à jour que ce que vous voulez:
J'utilise le plugin de version pour faire la version qui prend en charge -SNAPSHOT et valide qu'il existe une version de version de -SNAPSHOT (ce qui est important).
Si vous faites ce que je fais, vous obtiendrez la dernière version pour toutes les versions d'instantanés et la dernière version pour les versions. Vos versions seront également reproductibles.
Mise à jour
J'ai remarqué quelques commentaires demandant des détails sur ce flux de travail. Je dirai que nous n'utilisons plus cette méthode et la grande raison pour laquelle le plugin maven versions est bogué et en général est intrinsèquement défectueux.
Il est défectueux car pour exécuter le plug-in de versions afin d'ajuster les versions, toutes les versions existantes doivent exister pour que le pom fonctionne correctement. C'est-à-dire que le plugin de versions ne peut pas se mettre à jour vers la dernière version de quoi que ce soit s'il ne trouve pas la version référencée dans le pom. C'est en fait plutôt ennuyeux car nous nettoyons souvent les anciennes versions pour des raisons d'espace disque.
Vraiment, vous avez besoin d'un outil distinct de maven pour ajuster les versions (donc vous ne dépendez pas du fichier pom pour fonctionner correctement). J'ai écrit un tel outil dans le langage humble qu'est Bash. Le script mettra à jour les versions comme le plugin de version et vérifiera le pom dans le contrôle de source. Il fonctionne également 100 fois plus vite que le plugin des versions mvn. Malheureusement, il n'est pas écrit d'une manière publique, mais si les gens sont intéressés, je pourrais le faire et le mettre dans un gistub ou un github.
Revenons au workflow car certains commentaires ont demandé à ce sujet ce que nous faisons:
À ce stade, je suis d'avis que c'est une bonne chose d'avoir de toute façon la version et la version automatique un outil distinct de votre version générale.
Maintenant, vous pourriez penser que maven est un peu nul à cause des problèmes répertoriés ci-dessus, mais cela serait en fait assez difficile avec un outil de construction qui n'a pas de syntaxe extensible déclarative facile à analyser (aka XML).
En fait, nous ajoutons des attributs XML personnalisés via des espaces de noms pour aider à suggérer les scripts bash / groovy (par exemple, ne mettez pas à jour cette version).
la source
La syntaxe des dépendances se trouve dans la documentation de spécification des exigences de version des dépendances . Le voici pour être complet:
Dans votre cas, vous pourriez faire quelque chose comme
<version>[1.2.3,)</version>
la source
Dépendez-vous éventuellement de versions de développement qui changent évidemment beaucoup au cours du développement?
Au lieu d'incrémenter la version des versions de développement, vous pouvez simplement utiliser une version d'instantané que vous remplacez si nécessaire, ce qui signifie que vous n'aurez pas à modifier la balise de version à chaque modification mineure. Quelque chose comme 1.0-INSTANTANÉ ...
Mais peut-être que vous essayez de réaliser autre chose;)
la source
Si vous utilisez LATEST, assurez-vous d'avoir -U sinon le dernier instantané ne sera pas tiré.
la source
Couldn't download artifact: Failed to resolve version for com.app:common:jar:LATEST
Au moment où cette question a été posée, il y avait quelques problèmes avec les plages de versions dans maven, mais ceux-ci ont été résolus dans les nouvelles versions de maven. Cet article capture très bien le fonctionnement des plages de versions et les meilleures pratiques pour mieux comprendre comment maven comprend les versions: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855
la source
La vérité est que même en 3.x cela fonctionne toujours, étonnamment les projets se construisent et se déploient. Mais le mot-clé LATEST / RELEASE provoquant des problèmes dans m2e et éclipse partout, les projets ALSO dépendent de la dépendance qui a été déployée via le LATEST / RELEASE ne reconnaît pas la version.
Cela causera également des problèmes si vous essayez de définir la version en tant que propriété et de la référencer ailleurs.
Donc, la conclusion est d'utiliser le plugin versions-maven si vous le pouvez.
la source
Parfois, vous ne voulez pas utiliser les plages de versions, car il semble qu'elles soient "lentes" pour résoudre vos dépendances, surtout quand il y a une livraison continue en place et qu'il y a des tonnes de versions - principalement pendant un développement lourd.
Une solution de contournement serait d'utiliser le plugin versions-maven . Par exemple, vous pouvez déclarer une propriété:
et ajoutez le plugin versions-maven à votre fichier pom:
Ensuite, pour mettre à jour la dépendance, vous devez exécuter les objectifs:
S'il existe une version plus récente que 1.1.1, elle vous indiquera:
la source
Si vous voulez que Maven utilise la dernière version d'une dépendance, alors vous pouvez utiliser le plugin Versions Maven et comment utiliser ce plugin, Tim a déjà donné une bonne réponse, suivez sa réponse .
Mais en tant que développeur, je ne recommanderai pas ce type de pratiques. POURQUOI?
réponse à pourquoi est déjà donnée par Pascal Thivent dans le commentaire de la question
Je recommanderai ce type de pratique:
il est facile à entretenir et à déboguer. Vous pouvez mettre à jour votre POM en un rien de temps.
la source
Ma solution dans maven 3.5.4, utilisez nexus, dans eclipse:
puis dans éclipse:,
atl + F5
et choisissez leforce update of snapshots/release
ça marche pour moi.
la source