912 Stimmen

Wie kann ich Maven anweisen, die neueste Version einer Abhängigkeit zu verwenden?

In Maven werden Abhängigkeiten normalerweise wie folgt eingerichtet:

<dependency>
  <groupId>wonderful-inc</groupId>
  <artifactId>dream-library</artifactId>
  <version>1.2.3</version>
</dependency>

Wenn Sie mit Bibliotheken arbeiten, die häufig veröffentlicht werden, kann das ständige Aktualisieren des <version>-Tags etwas lästig sein. Gibt es eine Möglichkeit, Maven anzuweisen, immer die neueste verfügbare Version (aus dem Repository) zu verwenden?

227 Stimmen

Ich empfehle diese Praxis (ebenso wie die Verwendung von Versionsbereichen) nicht, um die Reproduzierbarkeit der Builds zu gewährleisten. Ein Build, der plötzlich aus einem unbekannten Grund fehlschlägt, ist viel ärgerlicher als die manuelle Aktualisierung einer Versionsnummer.

17 Stimmen

@PascalThivent Manuelles Aktualisieren einer Versionsnummer in einem pom ist ein Schmerz, wenn Sie kontinuierliche Releases tun. Ich verwende das versions-Plugin in Kombination mit dem scm-Plugin, um dies zu umgehen (siehe meine Antwort).

5 Stimmen

@PascalThivent Beide sind ärgerlich, aber auf unterschiedliche Weise. Ich möchte je nach Situation zwischen beiden wählen können und nicht gezwungen werden, eines zu benutzen, weil jemand anderes entschieden hat, dass dieses besser ist.

16voto

Martin Klinke Punkte 7148

Sind Sie möglicherweise von Entwicklungsversionen abhängig, die sich während der Entwicklung offensichtlich stark verändern?

Anstatt die Version von Entwicklungsversionen zu erhöhen, könnten Sie einfach eine Snapshot-Version verwenden, die Sie bei Bedarf überschreiben, was bedeutet, dass Sie das Versions-Tag nicht bei jeder kleinen Änderung ändern müssen. Etwas wie 1.0-SNAPSHOT...

Aber vielleicht wollen Sie ja etwas anderes erreichen ;)

12voto

trung Punkte 1024

Wer LATEST verwendet, sollte sicherstellen, dass er -U verwendet, da sonst der neueste Snapshot nicht gezogen wird.

mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST
// pull the latest snapshot for my-foo from all repositories

0 Stimmen

Dies zieht nicht den neuesten Snapshot aus dem lokalen m2-Repository

8voto

bclarance Punkte 149

Zu der Zeit, als diese Frage gestellt wurde, gab es einige Probleme mit den Versionsbereichen in Maven, aber diese wurden in neueren Versionen von Maven behoben. Dieser Artikel fasst sehr gut zusammen, wie Versionsbereiche funktionieren und gibt Best Practices, um besser zu verstehen, wie Maven Versionen versteht: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855

2 Stimmen

Dies mag zwar theoretisch eine Antwort auf die Frage sein, es wäre wünschenswert die wesentlichen Teile der Antwort hier aufzuführen und den Link als Referenz anzugeben.

8voto

Junchen Liu Punkte 5005

Die Wahrheit ist, dass es sogar in 3.x noch funktioniert und die Projekte überraschenderweise gebaut und bereitgestellt werden können. Aber die LATEST/RELEASE-Schlüsselwort verursacht Probleme in m2e und Eclipse ganz über dem Platz, ALSO Projekte hängt von der Abhängigkeit, die durch die LATEST/RELEASE bereitgestellt nicht die Version zu erkennen.

Es wird auch zu Problemen führen, wenn Sie versuchen, die Version als Eigenschaft zu definieren und sie an anderer Stelle zu referenzieren.

Die Schlussfolgerung ist also, die versions-maven-plugin wenn Sie können.

7voto

Markon Punkte 4180

Manchmal möchte man keine Versionsbereiche verwenden, weil es den Anschein hat, dass sie "langsam" sind, um Ihre Abhängigkeiten aufzulösen, besonders wenn es eine kontinuierliche Bereitstellung gibt und es tonnenweise Versionen gibt - hauptsächlich während der intensiven Entwicklung.

Eine Umgehung wäre die Verwendung der versions-maven-plugin . Sie können zum Beispiel eine Eigenschaft deklarieren:

<properties>
    <myname.version>1.1.1</myname.version>
</properties>

und fügen Sie das versions-maven-plugin zu Ihrer pom-Datei hinzu:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <properties>
                    <property>
                        <name>myname.version</name>
                        <dependencies>
                            <dependency>
                                <groupId>group-id</groupId>
                                <artifactId>artifact-id</artifactId>
                                <version>latest</version>
                            </dependency>
                        </dependencies>
                    </property>
                </properties>
            </configuration>
        </plugin>
    </plugins>
</build>

Um die Abhängigkeit zu aktualisieren, müssen Sie dann die Ziele ausführen:

mvn versions:update-properties validate

Wenn es eine neuere Version als 1.1.1 gibt, wird Ihnen das angezeigt:

[INFO] Updated ${myname.version} from 1.1.1 to 1.3.2

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