mvnd
- le démon Maven mvnd
mvnd
options spécifiquesmvnd
à partir des sourcesmvnd
mvnd
Ce projet vise à fournir des builds Maven plus rapides en utilisant des techniques connues de Gradle et Takari.
Aperçu de l'architecture :
mvnd
intègre Maven (il n'est donc pas nécessaire d'installer Maven séparément).
Les builds réels se produisent dans le cadre d'un processus d'arrière-plan de longue durée, alias un démon.
Une instance de démon peut répondre à plusieurs requêtes consécutives du client mvnd
.
Le client mvnd
est un exécutable natif construit à l'aide de GraalVM. Il démarre plus rapidement et utilise moins de mémoire que le démarrage d'une JVM traditionnelle.
Plusieurs démons peuvent être générés en parallèle s'il n'y a pas de démon inactif pour répondre à une demande de build.
Cette architecture apporte les avantages suivants :
La JVM pour exécuter les builds réels n’a pas besoin de redémarrer pour chaque build.
Les chargeurs de classe contenant les classes des plugins Maven sont mis en cache sur plusieurs versions. Les jars du plugin sont ainsi lus et analysés une seule fois. Les versions SNAPSHOT des plugins Maven ne sont pas mises en cache.
Le code natif produit par le compilateur Just-In-Time (JIT) à l'intérieur de la JVM est également conservé. Par rapport à Maven d'origine, la compilation JIT passe moins de temps. Lors des builds répétés, le code optimisé pour JIT est disponible immédiatement. Cela s'applique non seulement au code provenant des plugins Maven et de Maven Core, mais également à tout le code provenant du JDK lui-même.
mvnd
apporte les fonctionnalités suivantes en plus du Maven d'origine :
Par défaut, mvnd
construit vos modules en parallèle en utilisant plusieurs cœurs de processeur. Le nombre de cœurs utilisés est donné par la formule Math.max(Runtime.getRuntime().availableProcessors() - 1, 1)
. Si votre arborescence source ne prend pas en charge les builds parallèles, transmettez -T1
dans la ligne de commande pour rendre votre build en série.
Sortie de console améliorée : nous pensons que la sortie d'une version parallèle sur Maven d'origine est difficile à suivre. Par conséquent, nous avons implémenté une vue non continue simplifiée affichant l’état de chaque thread de build sur une ligne distincte. Voici à quoi cela ressemble sur une machine à 24 cœurs :
Une fois la construction terminée, la sortie complète de Maven est transmise à la console.
mvnd
Si SDKMAN! prend en charge votre système d'exploitation, c'est aussi simple que
sdk install mvnd
Si vous avez utilisé l'installation manuelle dans le passé, assurez-vous que les paramètres dans ~/.m2/mvnd.properties
ont toujours un sens. Avec SDKMAN!, le fichier ~/.m2/mvnd.properties
n'est généralement pas nécessaire du tout, car JAVA_HOME
et MVND_HOME
sont gérés par SDKMAN!.
brew install mvndaemon/homebrew-mvnd/mvnd
Remarque : Il existe deux formules : le mvnd
qui installe la dernière version et mvnd@1
qui installe la ligne 1.x.
sudo port install mvnd
Nous recherchons une contribution pour soutenir Chocolatey, Scoop ou asdf. Si vous avez envie de nous aider…
Facultativement, vous pouvez configurer la complétion comme suit :
# 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
est le seul shell pris en charge pour le moment.
Téléchargez le dernier ZIP adapté à votre plate-forme depuis https://downloads.apache.org/maven/mvnd/
Décompressez dans un répertoire de votre choix
Ajoutez le répertoire bin
à PATH
En option, vous pouvez créer ~/.m2/mvnd.properties
et définir la propriété java.home
au cas où vous ne voudriez pas vous soucier de définir la variable d'environnement JAVA_HOME
.
Testez si mvnd
fonctionne :
$ 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 "
Si vous êtes sous Windows et voyez un message indiquant que VCRUNTIME140.dll was not found
, vous devez installer vc_redist.x64.exe
à partir de https://support.microsoft.com/en-us/help/2977003/the-latest-supported. -visual-c-téléchargements. Voir oracle/graal#1762 pour plus d'informations.
Si vous êtes sous macOS, vous devrez supprimer les indicateurs de quarantaine de tous les fichiers après avoir décompressé l'archive :
$ xattr -r -d com.apple.quarantine mvnd-xyz-darwin-amd64
mvnd
est conçu pour accepter les mêmes options de ligne de commande que stock mvn
(plus quelques extras - voir ci-dessous), par exemple :
mvnd verify
mvnd
options spécifiques --status
répertorie les démons en cours d'exécution
--stop
tue tous les démons en cours d'exécution
mvnd --help
imprime la liste complète des options
La configuration peut être fournie via le fichier de propriétés. Mvnd lit le fichier de propriétés à partir des emplacements suivants :
le chemin des propriétés fourni à l'aide de la variable d'environnement MVND_PROPERTIES_PATH
ou de la variable système mvnd.propertiesPath
le chemin des propriétés locales situé dans [PROJECT_HOME]/.mvn/mvnd.properties
le chemin des propriétés utilisateur situé à l'adresse : [USER_HOME]/.m2/mvnd.properties
le chemin des propriétés système situé à l'adresse : [MVND_HOME]/conf/mvnd.properties
Les propriétés définies dans les premiers fichiers auront priorité sur les propriétés spécifiées dans un fichier de rang inférieur.
Quelques propriétés spéciales ne suivent pas le mécanisme ci-dessus :
mvnd.daemonStorage
: cette propriété définit l'emplacement où mvnd stocke ses fichiers (journaux de registre et de démon). Cette propriété ne peut être définie comme propriété système que sur la ligne de commande
mvnd.id
: cette propriété est utilisée en interne pour identifier le démon en cours de création
mvnd.extClasspath
: option interne pour spécifier le chemin de classe de l'extension Maven
mvnd.coreExtensions
: option interne pour spécifier la liste des extensions maven à enregistrer
Pour une liste complète des propriétés disponibles, veuillez consulter /dist/src/main/distro/conf/mvnd.properties.
mvnd
à partir des sources git
Maven
Téléchargez et décompressez GraalVM CE depuis GitHub
Définissez JAVA_HOME
à l'endroit où vous avez décompressé GraalVM à l'étape précédente. Vérifiez que la sortie java -version
est comme prévu :
$ $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)
Installez l'outil native-image
:
$ $JAVA_HOME /bin/gu install native-image
native-image
peut nécessiter l'installation d'un logiciel supplémentaire en fonction de votre plate-forme - voir la documentation 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
Veuillez noter que si vous utilisez Windows comme système d'exploitation, vous aurez besoin des prérequis suivants pour créer maven-mvnd
: une version de Visual Studio avec la charge de travail "Développement de bureau avec C++" et le composant individuel "Windows Universal CRT SDK".
mvnd
$ cp -R dist/target/mvnd-[version] [target-dir]
Ensuite, vous pouvez simplement ajouter [target-dir]/bin
à votre PATH
et exécuter mvnd
.
Nous sommes heureux d'améliorer mvnd
, donc les commentaires sont les bienvenus !