Was ist der Zweck von mvnw- und mvnw.cmd-Dateien?

257

Als ich eine Spring Boot-Anwendung erstellte, konnte ich Dateien im Stammverzeichnis des Projekts sehen mvnwund mvnw.cmdspeichern. Was ist der Zweck dieser beiden Dateien?

shaunthomas999
quelle

Antworten:

345

Diese Dateien stammen aus dem Maven-Wrapper . Es funktioniert ähnlich wie der Gradle-Wrapper .

Auf diese Weise können Sie das Maven-Projekt ausführen, ohne dass Maven installiert und auf dem Pfad vorhanden ist. Es lädt die richtige Maven-Version herunter, wenn sie nicht gefunden wird (soweit ich weiß, standardmäßig in Ihrem Benutzer-Home-Verzeichnis).

Die mvnwDatei ist für Linux (Bash) und die mvnw.cmdfür die Windows-Umgebung.


Führen Sie den folgenden Befehl aus, um alle erforderlichen Maven Wrapper-Dateien zu erstellen oder zu aktualisieren:

mvn -N io.takari:maven:wrapper

Um eine andere Version von maven zu verwenden, können Sie die Version wie folgt angeben:

mvn -N io.takari:maven:wrapper -Dmaven=3.3.3

Beide Befehle erfordern Maven PATH(fügen Sie den Pfad zu maven binzu Pathauf Systemvariablen) , wenn Sie bereits mvnw in Ihrem Projekt haben Sie verwenden können , ./mvnwstatt mvnin den Befehlen.

Ausweichen
quelle
Ihre Antwort ist sehr hilfreich. Ich überprüfe die Dokumentation zum Maven Wrapper. Ich habe den mvnBefehl für die Maven-Operation verwendet, obwohl ich ihn ./mvnwfür den gleichen Zweck verwenden konnte.
Shaunthomas999
2
Danke für die Antwort. Können Sie erklären, wann dies generiert wird, wie beim ersten Erstellen eines Projekts? Wird es entlang der Linie aktualisiert, wenn Sie Änderungen an Ihrem POM vornehmen, z. B. Hinzufügen, Entfernen von Abhängigkeiten / Plugins?
Asanke
1
und sollten Sie die mvnw.cmd-Dateien hinzufügen / festschreiben?
jpganz18
ja natürlich. Sie können Ihren Maven-Build schnell ausführen, ohne Maven zusätzlich installieren oder auf PATH haben zu müssen.
Dodge
1
Vielen Dank für die Antwort, sie ist sehr hilfreich. Können Sie uns etwas über die Portabilität der Maven-Einstellungsdateien erzählen, wenn wir auf diese Weise arbeiten? Saludos und nochmals vielen Dank.
Daniel Hernández
26

Der Befehl mvnwverwendet Maven, ~/.m2/wrapperauf das bei der ersten Verwendung standardmäßig heruntergeladen wird .

Die URL mit Maven wird in jedem Projekt unter folgender Adresse angegeben .mvn/wrapper/maven-wrapper.properties:

distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip

Rufen Sie zum Aktualisieren oder Ändern der Maven-Version Folgendes auf (beachten Sie dies --non-recursivebei Projekten mit mehreren Modulen):

./mvnw io.takari:maven:wrapper -Dmaven=3.3.9 

oder einfach .mvn/wrapper/maven-wrapper.propertiesmanuell ändern .

So generieren Sie Wrapper mit Maven von Grund auf neu (Sie müssen ihn bereits PATHausführen:

mvn io.takari:maven:wrapper -Dmaven=3.3.9 
Michal Kordas
quelle
5

Der Maven Wrapper ist eine ausgezeichnete Wahl für Projekte, die eine bestimmte Version von Maven benötigen (oder für Benutzer, die Maven überhaupt nicht installieren möchten). Anstatt viele Versionen davon im Betriebssystem zu installieren, können wir einfach das projektspezifische Wrapper-Skript verwenden.

mvnw: Es ist ein ausführbares Unix-Shell-Skript, das anstelle eines vollständig installierten Maven verwendet wird

mvnw.cmd : Es ist für Windows-Umgebung


Anwendungsfälle

Der Wrapper sollte mit verschiedenen Betriebssystemen funktionieren, z.

  • Linux
  • OSX
  • Windows
  • Solaris

Danach können wir unsere Ziele für das Unix-System folgendermaßen ausführen:

./mvnw clean install

Und der folgende Befehl für Batch:

./mvnw.cmd clean install

Wenn der angegebene Maven nicht in den Wrapper-Eigenschaften enthalten ist, wird er heruntergeladen und im Ordner $USER_HOME/.m2/wrapper/distsdes Systems installiert.


Maven Wrapper Plugin

Maven Wrapper-Plugin für die automatische Installation in einem einfachen Spring Boot-Projekt.

Zuerst müssen wir in den Hauptordner des Projekts gehen und diesen Befehl ausführen:

mvn -N io.takari:maven:wrapper

Wir können auch die Version von Maven angeben:

mvn -N io.takari:maven:wrapper -Dmaven=3.5.2

Die Option -N bedeutet –nicht rekursiv, sodass der Wrapper nur auf das Hauptprojekt des aktuellen Verzeichnisses angewendet wird, nicht auf Submodule.

Patel Romil
quelle
2

Die mit Abstand beste Option wäre heutzutage die Verwendung eines Maven-Containers als Builder-Tool. Ein mvn.shsolches Skript würde ausreichen:

#!/bin/bash
docker run --rm -ti \
 -v $(pwd):/opt/app \
 -w /opt/app \
 -e TERM=xterm \
 -v $HOME/.m2:/root/.m2 \
 maven mvn "$@"
André
quelle
7
Dies beantwortet nicht die OP-Frage, sondern schlägt nur eine Alternative vor
ahmedjaad
2
Die Grundidee von Maven Wrapper besteht darin, die richtige Version von Maven für dieses Projekt zu deklarieren. Ein Bonus besteht darin, dass Maven nicht manuell installiert werden muss. Ihr Ansatz verfehlt nicht nur die Lösung des Versionsproblems, sondern erfordert auch ein weiteres lokal installiertes Tool.
Max
2
Beachten Sie außerdem, dass dadurch das lokale Maven-Repository des Benutzers in der Docker-Instanz bereitgestellt wird. Normalerweise wird dies als root ausgeführt, sodass alles, was von der dockerisierten Maven-Instanz geschrieben wurde, root unter Linux gehört. Dies ist nicht unbedingt wünschenswert. Ich fand, dass eine ordnungsgemäß eingerichtete Nexus-Instanz, auf die die Docker-Build-Instanz zugreifen kann, weniger schmerzhaft ist, insbesondere wenn Sie reproduzierbare Builds wünschen.
Thorbjørn Ravn Andersen
Das ist lange her, aber ich bevorzuge immer noch diesen Weg. Informationen zur Maven-Version finden Sie in den Image-Tags (sehen Sie sich einfach die Maven-Seite in Docker Hub an). Was den Root-Besitz betrifft, so geschieht dies nicht auf dem Docker-Desktop, sondern in Linux-Boxen (und natürlich beim Erstellen von Knoten). Ein kleiner Trick kann in diesem Fall die aktuelle UID "erzwingen" (Argument -u), sodass das Problem behandelt wird. Aber alles bedeutet, dass ich diesen Ansatz um Größenordnungen besser finde. Docker ist ohnehin allgegenwärtig, insbesondere auf Build-Knoten.
André
1
(Fortsetzung) Jenkins Setup und Denkweise der alten Schule führen zu solchen Dingen. Moderne CI / CD-Tools machen das Gegenteil: Sie wählen einfach einen Build-Container. Aber das ist nur meine Meinung.
André