mvnd
– der Maven-Daemon mvnd
mvnd
spezifische Optionenmvnd
aus dem Quellcodemvnd
mvnd
Dieses Projekt zielt darauf ab, schnellere Maven-Builds mithilfe von Techniken bereitzustellen, die von Gradle und Takari bekannt sind.
Architekturübersicht:
mvnd
bettet Maven ein (es besteht also keine Notwendigkeit, Maven separat zu installieren).
Die eigentlichen Builds erfolgen innerhalb eines langlebigen Hintergrundprozesses, auch bekannt als Daemon.
Eine Daemon-Instanz kann mehrere aufeinanderfolgende Anfragen vom mvnd
Client bedienen.
Der mvnd
-Client ist eine native ausführbare Datei, die mit GraalVM erstellt wurde. Es startet schneller und verbraucht weniger Speicher im Vergleich zum Starten einer herkömmlichen JVM.
Mehrere Daemons können parallel erzeugt werden, wenn es keinen inaktiven Daemon gibt, der eine Build-Anfrage bedient.
Diese Architektur bringt folgende Vorteile:
Die JVM zum Ausführen der eigentlichen Builds muss nicht für jeden Build neu gestartet werden.
Die Klassenladeprogramme, die Klassen von Maven-Plugins enthalten, werden über mehrere Builds hinweg zwischengespeichert. Die Plugin-Jars werden somit nur einmal gelesen und geparst. SNAPSHOT-Versionen von Maven-Plugins werden nicht zwischengespeichert.
Der vom Just-In-Time (JIT)-Compiler in der JVM erstellte native Code bleibt ebenfalls erhalten. Im Vergleich zum Standard-Maven wird weniger Zeit für die JIT-Kompilierung aufgewendet. Bei den wiederholten Builds steht der JIT-optimierte Code sofort zur Verfügung. Dies gilt nicht nur für den Code, der von Maven-Plugins und Maven Core stammt, sondern auch für den gesamten Code, der vom JDK selbst stammt.
mvnd
bietet zusätzlich zum Standard-Maven die folgenden Funktionen:
Standardmäßig erstellt mvnd
Ihre Module parallel unter Verwendung mehrerer CPU-Kerne. Die Anzahl der genutzten Kerne ergibt sich aus der Formel Math.max(Runtime.getRuntime().availableProcessors() - 1, 1)
. Wenn Ihr Quellbaum keine parallelen Builds unterstützt, übergeben Sie -T1
in die Befehlszeile, um Ihren Build seriell zu machen.
Verbesserte Konsolenausgabe: Wir glauben, dass die Ausgabe eines parallelen Builds auf Standard-Maven schwer zu verfolgen ist. Aus diesem Grund haben wir eine vereinfachte, nicht fortlaufende Ansicht implementiert, die den Status jedes Build-Threads in einer separaten Zeile anzeigt. So sieht es auf einer Maschine mit 24 Kernen aus:
Sobald der Build abgeschlossen ist, wird die komplette Maven-Ausgabe an die Konsole weitergeleitet.
mvnd
Wenn SDKMAN! unterstützt Ihr Betriebssystem, es ist so einfach wie
sdk install mvnd
Wenn Sie in der Vergangenheit die manuelle Installation verwendet haben, stellen Sie bitte sicher, dass die Einstellungen in ~/.m2/mvnd.properties
weiterhin sinnvoll sind. Mit SDKMAN! wird die Datei ~/.m2/mvnd.properties
normalerweise überhaupt nicht benötigt, da sowohl JAVA_HOME
als auch MVND_HOME
von SDKMAN! verwaltet werden.
brew install mvndaemon/homebrew-mvnd/mvnd
Hinweis: Es gibt zwei Formeln: mvnd
, das die neueste Version installiert, und mvnd@1
, das die Zeile 1.x installiert.
sudo port install mvnd
Wir suchen einen Beitrag zur Unterstützung von Chocolatey, Scoop oder asdf. Wenn Sie Lust haben, uns zu helfen…
Optional können Sie die Vervollständigung wie folgt einrichten:
# ensure that MVND_HOME points to your mvnd distribution, note that sdkman does it for you
$ echo ' source $MVND_HOME/bin/mvnd-bash-completion.bash ' >> ~ /.bashrc
bash
ist derzeit die einzige Shell, die unterstützt wird.
Laden Sie die neueste für Ihre Plattform geeignete ZIP-Datei von https://downloads.apache.org/maven/mvnd/ herunter.
Entpacken Sie es in ein Verzeichnis Ihrer Wahl
Fügen Sie das bin
-Verzeichnis zu PATH
hinzu
Optional können Sie ~/.m2/mvnd.properties
erstellen und die Eigenschaft java.home
festlegen, falls Sie sich nicht mit dem Festlegen der Umgebungsvariablen JAVA_HOME
herumschlagen möchten.
Testen Sie, ob mvnd
funktioniert:
$ mvnd --version
Maven Daemon 0.0.11-linux-amd64 (native)
Terminal: org.jline.terminal.impl.PosixSysTerminal with pty org.jline.terminal.impl.jansi.osx.OsXNativePty
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /home/ppalaga/orgs/mvnd/mvnd/daemon/target/maven-distro
Java version: 11.0.1, vendor: AdoptOpenJDK, runtime: /home/data/jvm/adopt-openjdk/jdk-11.0.1+13
Default locale: en_IE, platform encoding: UTF-8
OS name: " linux " , version: " 5.6.13-200.fc31.x86_64 " , arch: " amd64 " , family: " unix "
Wenn Sie unter Windows arbeiten und eine Meldung sehen, dass VCRUNTIME140.dll was not found
, müssen Sie vc_redist.x64.exe
von https://support.microsoft.com/en-us/help/2977003/the-latest-supported installieren -visuelle-c-Downloads. Weitere Informationen finden Sie unter oracle/graal#1762.
Wenn Sie macOS verwenden, müssen Sie nach dem Entpacken des Archivs die Quarantäne-Flags von allen Dateien entfernen:
$ xattr -r -d com.apple.quarantine mvnd-xyz-darwin-amd64
mvnd
ist so konzipiert, dass es die gleichen Befehlszeilenoptionen wie stock mvn
akzeptiert (plus einige Extras – siehe unten), z. B.:
mvnd verify
mvnd
spezifische Optionen --status
listet laufende Daemons auf
--stop
tötet alle laufenden Daemons
mvnd --help
gibt die vollständige Liste der Optionen aus
Die Konfiguration kann über die Eigenschaftendatei bereitgestellt werden. Mvnd liest die Eigenschaftendatei von den folgenden Speicherorten:
Der Eigenschaftenpfad, der über die Umgebungsvariable MVND_PROPERTIES_PATH
oder die Systemvariable mvnd.propertiesPath
bereitgestellt wird
der lokale Eigenschaftenpfad unter [PROJECT_HOME]/.mvn/mvnd.properties
der Benutzereigenschaftenpfad unter: [USER_HOME]/.m2/mvnd.properties
der Systemeigenschaftenpfad unter: [MVND_HOME]/conf/mvnd.properties
In den ersten Dateien definierte Eigenschaften haben Vorrang vor Eigenschaften, die in einer Datei mit niedrigerem Rang angegeben sind.
Einige spezielle Eigenschaften folgen nicht dem oben genannten Mechanismus:
mvnd.daemonStorage
: Diese Eigenschaft definiert den Speicherort, an dem mvnd seine Dateien speichert (Registrierungs- und Daemon-Protokolle). Diese Eigenschaft kann nur als Systemeigenschaft in der Befehlszeile definiert werden
mvnd.id
: Diese Eigenschaft wird intern verwendet, um den zu erstellenden Daemon zu identifizieren
mvnd.extClasspath
: interne Option zum Angeben des Klassenpfads der Maven-Erweiterung
mvnd.coreExtensions
: interne Option zum Angeben der Liste der zu registrierenden Maven-Erweiterungen
Eine vollständige Liste der verfügbaren Eigenschaften finden Sie unter /dist/src/main/distro/conf/mvnd.properties.
mvnd
aus dem Quellcode git
Maven
Laden Sie GraalVM CE von GitHub herunter und entpacken Sie es
Setzen Sie JAVA_HOME
auf den Ort, an dem Sie GraalVM im vorherigen Schritt entpackt haben. Überprüfen Sie, ob die Ausgabe java -version
wie erwartet ist:
$ $JAVA_HOME /bin/java -version
openjdk version " 11.0.9 " 2020-10-20
OpenJDK Runtime Environment GraalVM CE 20.3.0 (build 11.0.9+10-jvmci-20.3-b06)
OpenJDK 64-Bit Server VM GraalVM CE 20.3.0 (build 11.0.9+10-jvmci-20.3-b06, mixed mode, sharing)
Installieren Sie das native-image
Tool:
$ $JAVA_HOME /bin/gu install native-image
Abhängig von Ihrer Plattform muss möglicherweise für native-image
zusätzliche Software installiert werden. Weitere Informationen finden Sie in der Dokumentation native-image
.
mvnd
$ git clone https://github.com/apache/maven-mvnd.git
$ cd maven-mvnd
$ mvn clean verify -Pnative
...
$ cd client
$ file target/mvnd
target/mvnd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=93a554f3807550a13c986d2af9a311ef299bdc5a, for GNU/Linux 3.2.0, with debug_info, not stripped
$ ls -lh target/mvnd
-rwxrwxr-x. 1 ppalaga ppalaga 25M Jun 2 13:23 target/mvnd
Bitte beachten Sie, dass Sie bei Verwendung von Windows als Betriebssystem folgende Voraussetzungen für die Erstellung maven-mvnd
benötigen: eine Version von Visual Studio mit dem Workload „Desktop-Entwicklung mit C++“ und der Einzelkomponente „Windows Universal CRT SDK“.
mvnd
$ cp -R dist/target/mvnd-[version] [target-dir]
Dann können Sie einfach [target-dir]/bin
zu Ihrem PATH
hinzufügen und mvnd
ausführen.
Wir freuen uns, mvnd
zu verbessern, daher ist Feedback sehr willkommen!