In Maven werden Abhängigkeiten normalerweise folgendermaßen eingerichtet:
<dependency>
<groupId>wonderful-inc</groupId>
<artifactId>dream-library</artifactId>
<version>1.2.3</version>
</dependency>
Wenn Sie jetzt mit Bibliotheken arbeiten, die häufig veröffentlicht werden, kann die ständige Aktualisierung des <version> -Tags etwas ärgerlich sein. Gibt es eine Möglichkeit, Maven anzuweisen, immer die neueste verfügbare Version (aus dem Repository) zu verwenden?
java
maven
dependencies
maven-2
maven-metadata
Anders Sandvig
quelle
quelle
Antworten:
HINWEIS:
Diese Antwort gilt nur für Maven 2! Die erwähnten
LATEST
undRELEASE
Metaversionen wurden vor über 6 Jahren in Maven 3 "aus Gründen reproduzierbarer Builds" gelöscht . Bitte beziehen Sie sich auf diese Maven 3-kompatible Lösung .Wenn Sie immer die neueste Version verwenden möchten, verfügt Maven über zwei Schlüsselwörter, die Sie als Alternative zu Versionsbereichen verwenden können. Sie sollten diese Optionen mit Vorsicht verwenden, da Sie nicht mehr die Kontrolle über die von Ihnen verwendeten Plugins / Abhängigkeiten haben.
Siehe die POM Syntax Abschnitt des Maven Buch für weitere Details. Oder lesen Sie dieses Dokument über Abhängigkeitsversionsbereiche , in denen:
[
&]
) bedeutet "geschlossen" (einschließlich).(
&)
) bedeutet "offen" (exklusiv).Hier ist ein Beispiel, das die verschiedenen Optionen veranschaulicht. Im Maven-Repository enthält com.foo:my-foo die folgenden Metadaten:
Wenn eine Abhängigkeit von diesem Artefakt erforderlich ist, haben Sie folgende Möglichkeiten (andere Versionsbereiche können natürlich angegeben werden, wobei nur die relevanten hier angezeigt werden):
Deklarieren Sie eine genaue Version (wird immer auf 1.0.1 aufgelöst):
Deklarieren Sie eine explizite Version (wird immer auf 1.0.1 aufgelöst, es sei denn, es kommt zu einer Kollision, wenn Maven eine passende Version auswählt):
Deklarieren Sie einen Versionsbereich für alle 1.x (wird derzeit in 1.1.1 aufgelöst):
Deklarieren Sie einen offenen Versionsbereich (wird auf 2.0.0 aufgelöst):
Deklarieren Sie die Version als NEUESTE (wird auf 2.0.0 aufgelöst) (aus maven 3.x entfernt)
Deklarieren Sie die Version als RELEASE (wird in 1.1.1 aufgelöst) (aus maven 3.x entfernt):
Beachten Sie, dass Ihre eigenen Bereitstellungen standardmäßig den "neuesten" Eintrag in den Maven-Metadaten aktualisieren. Um den "Release" -Eintrag zu aktualisieren, müssen Sie jedoch das "Release-Profil" aus dem Maven-Super-POM aktivieren . Sie können dies entweder mit "-Prelease-Profil" oder "-DperformRelease = true" tun.
Hervorzuheben ist, dass jeder Ansatz, mit dem Maven die Abhängigkeitsversionen (LATEST, RELEASE und Versionsbereiche) auswählen kann, Sie für Zeitprobleme offen lässt, da spätere Versionen ein anderes Verhalten aufweisen können (z. B. hat das Abhängigkeits-Plugin zuvor einen Standard geändert Wert von wahr nach falsch, mit verwirrenden Ergebnissen).
Es ist daher im Allgemeinen eine gute Idee, genaue Versionen in Releases zu definieren. Wie Tims Antwort zeigt, ist das Maven-Versions-Plugin ein praktisches Tool zum Aktualisieren von Abhängigkeitsversionen, insbesondere der Versionen: Use-Recent-Versionen und Versionen: Use-Recent-Releases- Ziele.
quelle
[1.1,2.0)
Jetzt weiß ich, dass dieses Thema alt ist, aber beim Lesen der Frage und der vom OP bereitgestellten Antwort scheint das Maven Versions Plugin tatsächlich eine bessere Antwort auf seine Frage gewesen zu sein:
Insbesondere könnten folgende Ziele von Nutzen sein:
Die folgenden anderen Ziele werden ebenfalls bereitgestellt:
Ich dachte nur, ich würde es für zukünftige Referenzzwecke hinzufügen.
quelle
Bitte werfen Sie einen Blick auf diese Seite (Abschnitt "Abhängigkeitsversionsbereiche"). Was Sie vielleicht tun möchten, ist so etwas wie
Diese Versionsbereiche sind in Maven2 implementiert.
quelle
mvn dependency:tree -Dverbose
das herauszufinden. Dies könnte die unerwartete Version erklären.Im Gegensatz zu anderen gibt es meiner Meinung nach viele Gründe, warum Sie immer die neueste Version wünschen . Insbesondere, wenn Sie eine kontinuierliche Bereitstellung durchführen (wir haben manchmal 5 Releases pro Tag) und kein Projekt mit mehreren Modulen durchführen möchten.
Ich lasse Hudson / Jenkins für jeden Build Folgendes tun:
Das heißt, ich verwende das Versions-Plugin und das SCM-Plugin, um die Abhängigkeiten zu aktualisieren und sie dann in die Quellcodeverwaltung einzuchecken. Ja, ich lasse mein CI SCM-Checkins durchführen (was Sie für das Maven Release Plugin sowieso tun müssen).
Sie möchten das Versions-Plugin so einrichten, dass nur das aktualisiert wird, was Sie möchten:
Ich benutze das Release-Plugin, um das Release zu machen, das sich um -SNAPSHOT kümmert und überprüft, ob es eine Release-Version von -SNAPSHOT gibt (was wichtig ist).
Wenn Sie das tun, was ich tue, erhalten Sie die neueste Version für alle Snapshot-Builds und die neueste Release-Version für Release-Builds. Ihre Builds sind auch reproduzierbar.
Aktualisieren
Ich habe einige Kommentare bemerkt, in denen nach Einzelheiten zu diesem Workflow gefragt wurde. Ich werde sagen, dass wir diese Methode nicht mehr verwenden und der Hauptgrund dafür, dass das Plugin für die Maven-Versionen fehlerhaft und im Allgemeinen fehlerhaft ist.
Es ist fehlerhaft, da zum Ausführen des Versions-Plugins zum Anpassen der Versionen alle vorhandenen Versionen vorhanden sein müssen, damit der POM ordnungsgemäß ausgeführt werden kann. Das heißt, das Versions-Plugin kann nicht auf die neueste Version von irgendetwas aktualisiert werden, wenn es die im POM referenzierte Version nicht findet. Dies ist eigentlich ziemlich ärgerlich, da wir alte Versionen häufig aus Gründen des Speicherplatzes bereinigen.
Sie benötigen wirklich ein separates Tool von maven, um die Versionen anzupassen (damit Sie nicht von der POM-Datei abhängig sind, um korrekt ausgeführt zu werden). Ich habe ein solches Werkzeug in der niederen Sprache Bash geschrieben. Das Skript aktualisiert die Versionen wie das Versions-Plugin und überprüft den POM wieder in der Quellcodeverwaltung. Es läuft auch 100x schneller als das Plugin für MVN-Versionen. Leider ist es nicht für den öffentlichen Gebrauch geschrieben, aber wenn die Leute interessiert sind, könnte ich es so machen und es in einen Kern oder Github stecken.
Zurück zum Workflow, als einige Kommentare dazu fragten, was wir tun:
An diesem Punkt bin ich der Meinung, dass es eine gute Sache ist, die Release- und Auto-Version sowieso von Ihrem allgemeinen Build zu trennen.
Jetzt könnte man denken, dass Maven aufgrund der oben aufgeführten Probleme irgendwie scheiße ist, aber dies wäre tatsächlich ziemlich schwierig mit einem Build-Tool, das keine deklarative, einfach zu analysierende erweiterbare Syntax (auch bekannt als XML) hat.
Tatsächlich fügen wir benutzerdefinierte XML-Attribute über Namespaces hinzu, um Hinweise auf Bash / Groovy-Skripte zu erhalten (z. B. aktualisieren Sie diese Version nicht).
quelle
Die Abhängigkeitssyntax befindet sich in der Dokumentation zur Anforderungsspezifikation für die Abhängigkeitsversion . Hier ist es der Vollständigkeit halber:
In Ihrem Fall könnten Sie so etwas tun
<version>[1.2.3,)</version>
quelle
Sind Sie möglicherweise auf Entwicklungsversionen angewiesen, die sich während der Entwicklung offensichtlich stark ändern?
Anstatt die Version von Entwicklungsversionen zu erhöhen, können Sie auch eine Snapshot-Version verwenden, die Sie bei Bedarf überschreiben. Dies bedeutet, dass Sie das Versions-Tag nicht bei jeder geringfügigen Änderung ändern müssen. So etwas wie 1.0-SNAPSHOT ...
Aber vielleicht versuchst du etwas anderes zu erreichen;)
quelle
Wenn Sie LATEST verwenden, stellen Sie bitte sicher, dass Sie -U haben, da sonst der neueste Schnappschuss nicht abgerufen wird.
quelle
Couldn't download artifact: Failed to resolve version for com.app:common:jar:LATEST
Zu dem Zeitpunkt, als diese Frage gestellt wurde, gab es einige Knicke mit Versionsbereichen in Maven, aber diese wurden in neueren Versionen von Maven behoben. Dieser Artikel beschreibt sehr gut, wie Versionsbereiche funktionieren, und bewährte Methoden, um besser zu verstehen, wie Maven Versionen versteht: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855
quelle
Die Wahrheit ist sogar in 3.x, dass es immer noch funktioniert, überraschenderweise werden die Projekte erstellt und bereitgestellt. Aber das Schlüsselwort LATEST / RELEASE, das überall Probleme in m2e und Eclipse verursacht. AUCH Projekte hängen von der Abhängigkeit ab, die durch LATEST / RELEASE bereitgestellt wird und die Version nicht erkennt.
Dies führt auch zu Problemen, wenn Sie versuchen, die Version als Eigenschaft zu definieren und an anderer Stelle darauf zu verweisen.
Die Schlussfolgerung ist also, dass Sie das Versions-Maven-Plugin verwenden, wenn Sie können.
quelle
Manchmal möchten Sie keine Versionsbereiche verwenden, da diese Ihre Abhängigkeiten anscheinend "langsam" auflösen, insbesondere wenn eine kontinuierliche Bereitstellung vorhanden ist und es Unmengen von Versionen gibt - hauptsächlich während einer intensiven Entwicklung.
Eine Problemumgehung wäre die Verwendung des Versions-Maven-Plugins . Sie können beispielsweise eine Eigenschaft deklarieren:
und füge das version-maven-plugin deiner pom datei hinzu:
Um die Abhängigkeit zu aktualisieren, müssen Sie die folgenden Ziele ausführen:
Wenn es eine neuere Version als 1.1.1 gibt, wird Folgendes angezeigt:
quelle
Wenn Sie möchten, dass Maven die neueste Version einer Abhängigkeit verwendet, können Sie das Versions Maven-Plugin verwenden. Wie Sie dieses Plugin verwenden, hat Tim bereits eine gute Antwort gegeben. Folgen Sie seiner Antwort .
Aber als Entwickler werde ich diese Art von Praktiken nicht empfehlen. WARUM?
Die Antwort auf das Warum gibt Pascal Thivent bereits im Kommentar zur Frage
Ich werde diese Art der Übung empfehlen:
Es ist leicht zu warten und leicht zu debuggen. Sie können Ihr POM in kürzester Zeit aktualisieren.
quelle
MEINE Lösung in Maven 3.5.4, benutze Nexus, in Eclipse:
dann in Eclipse:
atl + F5
und wählen Sie dieforce update of snapshots/release
Für mich geht das.
quelle