2010-10-07 25 views
3

Maven 2.2.1 prétend soutenir les gammes de version (voir par exemple http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-project-dependencies.html#pom-relationships-sect-version-ranges)maven plage de dépendance ne fonctionne pas comme prévu

J'ai essayé d'une installation de Maven brandnew la pom suivante:

<project> 

    <modelVersion>4.0.0</modelVersion> 
    <artifactId>rangetest</artifactId> 
    <groupId>my.group</groupId> 
    <version>1.0</version> 
    <packaging>jar</packaging> 

    <description>test project containing one dependency, only</description> 
    <dependencies> 
    <dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.8</version> 
    <scope>test</scope> 
    </dependency> 
    </dependencies> 
</project> 

La dépendance devrait résoudre à junit 4.8.2, non? Mais au contraire, la version 4.8 est résolu:

C:\Users>mvn dependency:tree 
[INFO] Scanning for projects... 
[INFO] Searching repository for plugin with prefix: 'dependency'. 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building Unnamed - my.group:rangetest:jar:1.0 
[INFO] task-segment: [dependency:tree] 
[INFO] ------------------------------------------------------------------------ 
[INFO] [dependency:tree {execution: default-cli}] 
[INFO] my.group:rangetest:jar:1.0 
[INFO] \- junit:junit:jar:4.8:test 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESSFUL 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 2 seconds 
[INFO] Finished at: Thu Oct 07 14:30:40 CEST 2010 
[INFO] Final Memory: 9M/23M 
[INFO] ------------------------------------------------------------------------ 

Vous pourriez penser qu'il est un problème avec Junit, comme 4.8 est une version existante, mais ce n'est pas. Dans mes projets, j'ai des versions déployées de 1.0.0 à 1.0.15 (pas de version 1.0!), Mais mvn dependency:tree se plaint d'artefact manquant de la version 1.0.

Répondre

7

Cela ne fonctionne que si vous spécifiez réellement une plage de versions ou si vous avez plusieurs POM. Vous utilisez 4.8 qui est un numéro de version unique, alors Maven essaie de le résoudre directement. Une gamme de versions doit commencer par [ ou ( (inclusif et exclusif, respectivement).

Dans votre cas, essayez: [4.8,4.9)

Cela devrait vous donner la version la plus récente avec la même API (à savoir tous les corrections de bugs, mais pas de rupture des changements).

Ce document montre comment Maven interprète versions: https://maven.apache.org/enforcer/enforcer-rules/versionRanges.html

La première ligne semble soutenir votre position (4.8 signifie « au moins 4,8 ») mais il y a un hic: Maven ne sélectionnez une version supérieure si quelqu'un en particulier demande ça. Donc, sauf si vous avez plus de POMs dans votre build et l'un de ceux demande 4.8.2, 4.8 est "assez bon" pour Maven. Pensez-y comme un indice pour la résolution des conflits. Si POM A demande 4.8 et B demande 4.8.2 et B dépend de A, alors Maven doit prendre une décision. Devrait-il échouer? Devrait-il utiliser 4,8? Ou 4.8.2?

Les règles résolvent ce conflit en choisissant 4.8.2 sans donner d'avertissement ou d'erreur. Si A demande [4.8], vous obtiendrez une erreur car Maven ne peut pas "mettre à jour" la dépendance en 4.8.2 et ne peut certainement pas rétrograder 4.8.2 à 4.8.

+0

Bien, Maven gamme spec http: //docs.codehaus.org/display/MAVEN/Dépendance + Médiation + et + Conflit + Résolution # DependencyMediationandConflictResolution-DependencyVersionRanges fait la différence entre les exigences "dures" (par exemple [4.8]) et les exigences "souples" (comme 4.8 sans crochets). Quelle est l'utilisation des exigences douces, alors? – Jay

+0

@Jay: Jamais entendu parler du terme. '4.8.1' sélectionne juste cette version et rien d'autre. Je suppose que le document est périmé. –

+0

Oui, peut-être un autre triste exemple de la piètre documentation de Maven. Connaissez-vous une meilleure référence pour les versions? – Jay

2

Il ne semble pas y avoir de qualificatif de plage dans votre balise version. Peut-être que vous vouliez dire d'utiliser ce qui suit pour exiger la version 4.8 ou ultérieure:

<version>[4.8,)</version>
+0

Est-ce que c'est [ 4,8,) '? –

6

Si vous voulez utiliser des plages de version, spécifiez une plage de versions que d'autres ont souligné. Actuellement, vous n'êtes pas. Mais mon vrai conseil serait de de ne pas utiliser les gammes de version à tous, les gammes de versions sont une mauvaise idée pour la reproductibilité de construction et la dernière chose que vous voulez est une construction qui commence soudainement à échouer pour une raison inconnue. Ne le faites pas, ils sont une mauvaise pratique (ce qui est probablement la raison pour laquelle les gammes de versions ne sont plus documentées).

+0

(+1) voici mon dernier vote pour aujourd'hui :-) BTW, qui a fait ce CW et pourquoi? –

+0

convenu, sauf si vous voulez utiliser bugfixversion automatiquement. mais est une douleur dans le cul ... – Salandur

+0

@seanizer: Il est soit le OP (seulement l'OP peut faire sa propre question CW) ou le système après 7/8 (?) édits. Mais dans ce cas, c'est l'OP comme on peut le voir dans l'historique des révisions. Probablement une "erreur" mais l'OP est nouveau ici. –