3 Stimmen

maven dependency range funktioniert nicht wie erwartet

Maven 2.2.1 behauptet, Versionsbereiche zu unterstützen (siehe z.B. http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-project-dependencies.html#pom-relationships-sect-version-ranges )

Ich habe von einer brandneuen Maven-Installation das folgende Pom ausprobiert:

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

Die Abhängigkeit sollte zu junit 4.8.2 aufgelöst werden, richtig? Aber stattdessen wird die Version 4.8 aufgelöst:

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] ------------------------------------------------------------------------

Man könnte meinen, dass es ein Problem mit Junit ist, da 4.8 eine bestehende Version ist, aber das ist es nicht. In meinen Projekten habe ich Versionen von 1.0.0 bis 1.0.15 eingesetzt (keine Version 1.0!), aber mvn dependency:tree beschwert sich über ein fehlendes Artefakt der Version 1.0.

8voto

Aaron Digulla Punkte 308693

Das funktioniert nur, wenn Sie tatsächlich einen Versionsbereich angeben oder wenn Sie mehr als ein POM haben. Sie verwenden 4.8 was eine einzelne Versionsnummer ist, so dass Maven versucht, diese direkt aufzulösen. Ein Versionsbereich muss beginnen mit [ o ( (einschließlich bzw. ausschließlich).

In Ihrem Fall sollten Sie es versuchen: [4.8,4.9)

Damit sollten Sie die höchste Version mit der gleichen API erhalten (d.h. mit allen Fehlerbehebungen, aber ohne wesentliche Änderungen).

Dieses Dokument zeigt, wie Maven die Versionen interpretiert: https://maven.apache.org/enforcer/enforcer-rules/versionRanges.html

Die erste Zeile scheint Ihre Position zu unterstützen ( 4.8 bedeutet "mindestens 4,8"), aber es gibt einen Haken: Maven wird nur dann eine höhere Version auswählen, wenn jemand ausdrücklich danach fragt. Es sei denn, Sie haben mehrere POMs in Ihrem Build und eines davon fragt nach 4.8.2 , 4.8 ist "gut genug" für Maven.

Betrachten Sie es als einen Hinweis zur Konfliktlösung. Wenn POM A nach 4.8 und B nach 4.8.2 fragt et B hängt von A ab, dann muss Maven eine Entscheidung treffen. Soll es scheitern? Soll es 4.8 verwenden? Oder 4.8.2?

Die Regeln lösen diesen Konflikt auf, indem sie 4.8.2 auswählen, ohne eine Warnung oder einen Fehler zu geben.

Wenn A fragt nach [4.8] erhalten Sie stattdessen eine Fehlermeldung, da Maven die Abhängigkeit nicht stillschweigend auf 4.8.2 "upgraden" kann und schon gar nicht 4.8.2 auf 4.8 herunterstufen kann.

7voto

Pascal Thivent Punkte 548176

Wenn Sie Versionsbereiche verwenden wollen, geben Sie einen Versionsbereich an, wie bereits erwähnt. Derzeit tun Sie das nicht.

Mein wirklicher Ratschlag wäre jedoch, dass überhaupt keine Versionsbereiche verwenden Versionsbereiche sind eine schlechte Idee für die Reproduzierbarkeit von Builds, und das Letzte, was man will, ist ein Build, das plötzlich aus einem unbekannten Grund ausfällt. Tun Sie es einfach nicht, sie sind eine schlechte Praxis (was wahrscheinlich der Grund ist, warum Versionsbereiche nicht mehr dokumentiert sind).

2voto

Philipp Jardas Punkte 3082

Es scheint keinen Bereichsqualifizierer in Ihrer version Tag. Vielleicht wollten Sie das Folgende verwenden, um Version 4.8 oder höher zu verlangen:

<version>\[4.8,)</version>

0voto

Basheer AL-MOMANI Punkte 13273

In meinem Fall funktionierte alles, aber plötzlich bekam ich diesen Fehler

No versions are present in the repository for the artifact with a range [x,y)

Ich war in der Bibliothek .m2/repository und löschte den gesamten Ordner,

wenn Sie den Ordner einer bestimmten Version der Bibliothek entfernt haben, wird es nicht funktionieren, Sie sollten die Ordner aller Versionen dieser Bibliothek entfernen

eine weitere Sache, wenn die lib ist transitiv müssen Sie möglicherweise alle Bibliotheken in den Abhängigkeitspfad zu entfernen

Ich hoffe, dies hilft Ihnen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X