NOTE :
Le mentionné LATEST
y RELEASE
métaversions ont été abandonnés pour les dépendances des plugins dans Maven 3 "pour des raisons de reproductibilité des constructions". il y a plus de 6 ans. (Ils fonctionnent toujours parfaitement bien pour les dépendances ordinaires). Pour les dépendances des plugins, veuillez vous référer à ceci Solution conforme à Maven 3 .
Si vous voulez 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 n'avez plus le contrôle des plugins/dépendances que vous utilisez.
Lorsque vous dépendez d'un plugin ou d'une dépendance, vous pouvez utiliser la valeur de version LATEST ou RELEASE. LATEST fait référence à la dernière version publiée ou snapshot d'un artefact particulier, l'artefact le plus récemment déployé dans un référentiel particulier. RELEASE fait référence à la dernière version non snapshot du référentiel. En général, ce n'est pas une bonne pratique de concevoir un logiciel qui dépend d'une version non spécifique d'un artefact. Si vous développez un logiciel, vous pouvez utiliser RELEASE ou LATEST par commodité afin de ne pas avoir à mettre à jour les numéros de version lorsqu'une nouvelle version d'une bibliothèque tierce est publiée. Lorsque vous diffusez un logiciel, vous devez toujours vous assurer que votre projet dépend de versions spécifiques afin de réduire les risques que votre compilation ou votre projet soit affecté par une version du logiciel qui n'est pas sous votre contrôle. Utilisez LATEST et RELEASE avec prudence, voire pas du tout.
Voir le Section Syntaxe POM du livre Maven pour plus de détails. Ou voyez ce document sur Gammes de versions de dépendances où :
- Un crochet (
[
& ]
) signifie "fermé" (inclusivement).
- Une parenthèse (
(
& )
) signifie "ouvert" (exclusif).
Voici un exemple illustrant les différentes options. Dans le référentiel Maven, com.foo:my-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 requise, vous avez les options suivantes (autres gammes de versions peuvent être spécifiés bien sûr, nous ne montrons ici que ceux qui sont pertinents) :
Déclarer une version exacte (sera toujours résolu à 1.0.1) :
<version>[1.0.1]</version>
Déclarer une version explicite (qui sera toujours résolue par la version 1.0.1, sauf en cas de collision, auquel cas Maven sélectionnera une version correspondante) :
<version>1.0.1</version>
Déclarer une gamme de versions pour toutes les 1.x (sera actuellement résolu à 1.1.1) :
<version>[1.0.0,2.0.0)</version>
Déclarer une gamme de versions non limitée (sera résolu à 2.0.0) :
<version>[1.0.0,)</version>
Déclare la version comme LATEST (sera résolu à 2.0.0) (supprimé de maven 3.x)
<version>LATEST</version>
Déclare la version comme RELEASE (sera résolue en 1.1.1) (supprimé de maven 3.x) :
<version>RELEASE</version>
Notez que, par défaut, vos propres déploiements mettront à jour l'entrée "latest" dans les métadonnées Maven, mais que pour mettre à jour l'entrée "release", vous devez activer le "release-profile" à partir de l'onglet "release". Maven super POM . Vous pouvez le faire avec "-Prelease-profile" ou "-DperformRelease=true".
Il est important de souligner que toute approche qui permet à Maven de choisir les versions des dépendances (LATEST, RELEASE et plages de versions) peut vous exposer à des problèmes de temps de construction, car les versions ultérieures peuvent avoir un comportement différent (par exemple, le plugin de dépendance a déjà changé une valeur par défaut de true à false, avec des résultats déroutants).
Il est donc généralement judicieux de définir des versions exactes dans les versions. Comme La réponse de Tim souligne que le maven-versions-plugin est un outil pratique pour la mise à jour des versions des dépendances, en particulier la version versions:use-latest-versions y versions:use-latest-releases objectifs.
0 votes
@Martin Je suis conscient de la convention x.y.z-SNAPSHOT, mais je pensais aux bibliothèques qui sont publiées dans des versions finales dans le référentiel (c'est-à-dire passer de dream-library-1.2.3.jar à dream-library-1.2.4.jar, et ainsi de suite).
220 votes
Je ne recommande vraiment pas cette pratique (ni l'utilisation de plages de versions) pour le bien de la reproductibilité de la compilation. Une compilation qui échoue soudainement pour une raison inconnue est bien plus ennuyeuse que la mise à jour manuelle d'un numéro de version.
17 votes
@PascalThivent La mise à jour manuelle d'un numéro de version dans un pom est pénible si vous faites des versions continues. J'utilise le plugin versions combiné avec le plugin scm pour contourner ce problème (voir ma réponse).
4 votes
@PascalThivent Les deux sont ennuyeux, mais d'une manière différente. J'aimerais pouvoir choisir entre les deux en fonction de ma situation et ne pas être obligé d'en utiliser un parce que quelqu'un d'autre a décidé que celui-ci serait meilleur.
0 votes
La bibliothèque guava est un bon exemple de classe supprimée de la version précédente dans la version la plus récente, ce qui interrompt la construction. La mentalité de Maven est que toute version plus récente peut remplacer toute version antérieure, ce qui n'est pas le cas en pratique.