À quoi servent les fichiers mvnw et mvnw.cmd?

257

Lorsque j'ai créé une application Spring Boot, je pouvais voir mvnwet les mvnw.cmdfichiers à la racine du projet. Quel est le but de ces deux fichiers?

shaunthomas999
la source

Réponses:

345

Ces fichiers proviennent du wrapper Maven . Il fonctionne de manière similaire à l' emballage Gradle .

Cela vous permet d'exécuter le projet Maven sans que Maven soit installé et présent sur le chemin. Il télécharge la bonne version de Maven si elle n'est pas trouvée (pour autant que je sache par défaut dans votre répertoire personnel).

Le mvnwfichier est pour Linux (bash) et l' mvnw.cmdest pour l'environnement Windows.


Pour créer ou mettre à jour tous les fichiers Wrapper Maven nécessaires, exécutez la commande suivante:

mvn -N io.takari:maven:wrapper

Pour utiliser une version différente de maven, vous pouvez spécifier la version comme suit:

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

Les deux commandes nécessitent maven on PATH(ajoutez le chemin d'accès à maven binto Pathsur les variables système) si vous avez déjà mvnw dans votre projet, vous pouvez utiliser ./mvnwplutôt que mvndans les commandes.

Esquive
la source
Votre réponse est très utile. Je vérifie la documentation du wrapper maven. J'utilisais la mvncommande pour le fonctionnement de maven même si je pouvais l'utiliser ./mvnwdans le même but.
shaunthomas999
2
Merci d'avoir répondu. Pouvez-vous expliquer quand cela est généré, comme lors de la création initiale d'un projet? Sera-t-il mis à jour le long de la ligne lorsque vous apportez des modifications à votre pom comme l'ajout de suppression de dépendances / plugins?
Asanke
1
et, devez-vous ajouter / valider les fichiers mvnw.cmd?
jpganz18
Oui bien sûr. il vous permet d'exécuter rapidement votre build maven sans avoir besoin d'installer maven supplémentaire ou de l'avoir sur PATH.
Dodge
1
Merci beaucoup pour la réponse, c'est très utile ¿Pourriez-vous nous parler de la portabilité des fichiers de paramètres maven lorsque nous travaillons de cette façon? Salutations et merci encore.
Daniel Hernández
26

La commande mvnwutilise Maven qui est par défaut téléchargé sur~/.m2/wrapper lors de la première utilisation.

L'URL avec Maven est spécifiée dans chaque projet à .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

Pour mettre à jour ou changer la version de Maven, appelez les éléments suivants (rappelez-vous --non-recursivepour les projets multi-modules):

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

ou simplement modifier .mvn/wrapper/maven-wrapper.properties manuellement.

Pour générer un wrapper à partir de zéro à l'aide de Maven (vous devez l'avoir déjà en cours d' PATHexécution:

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

Le Maven Wrapper est un excellent choix pour les projets qui ont besoin d'une version spécifique de Maven (ou pour les utilisateurs qui ne veulent pas installer Maven du tout). Au lieu d'en installer de nombreuses versions dans le système d'exploitation, nous pouvons simplement utiliser le script d'encapsulation spécifique au projet.

mvnw: c'est un script shell Unix exécutable utilisé à la place d'un Maven entièrement installé

mvnw.cmd : c'est pour l'environnement Windows


Cas d'utilisation

L'encapsuleur doit fonctionner avec différents systèmes d'exploitation tels que:

  • Linux
  • OSX
  • les fenêtres
  • Solaris

Après cela, nous pouvons exécuter nos objectifs comme ceci pour le système Unix:

./mvnw clean install

Et la commande suivante pour Batch:

./mvnw.cmd clean install

Si nous n'avons pas le Maven spécifié dans les propriétés du wrapper, il sera téléchargé et installé dans le dossier $USER_HOME/.m2/wrapper/distsdu système.


Plugin Maven Wrapper

Plugin Maven Wrapper pour effectuer l'installation automatique dans un simple projet Spring Boot.

Tout d'abord, nous devons aller dans le dossier principal du projet et exécuter cette commande:

mvn -N io.takari:maven:wrapper

On peut également spécifier la version de Maven:

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

L'option -N signifie –non récursif de sorte que l'encapsuleur ne sera appliqué qu'au projet principal du répertoire courant, pas dans aucun sous-module.

Patel Romil
la source
2

De loin, la meilleure option de nos jours serait d'utiliser un conteneur Maven comme outil de création. Un mvn.shscript comme celui-ci suffirait:

#!/bin/bash
docker run --rm -ti \
 -v $(pwd):/opt/app \
 -w /opt/app \
 -e TERM=xterm \
 -v $HOME/.m2:/root/.m2 \
 maven mvn "$@"
André
la source
7
Cela ne répond pas à la question OP, cela suggère simplement une alternative
ahmedjaad
2
L'idée très basique du wrapper maven est de déclarer la version correcte de maven pour ce projet. Et un bonus évite d'avoir à installer manuellement maven. Votre approche échoue non seulement à résoudre le problème de version, mais nécessite un autre outil installé localement.
Max
2
Notez également que cela monte le référentiel Maven local des utilisateurs dans l'instance de docker. En règle générale, cela s'exécute en tant que root, donc tout ce qui est écrit par l'instance maven dockerized appartient à root sous Linux. Ce n'est pas nécessairement souhaitable. J'ai trouvé qu'une instance de Nexus correctement configurée accessible à l'instance de construction de docker était moins pénible, surtout si vous souhaitez des versions reproductibles.
Thorbjørn Ravn Andersen
C'était il y a longtemps, mais je préfère toujours cette façon. À propos de la version maven, les balises d'image le fournissent (il suffit de regarder la page maven dans Docker Hub). Quant à la propriété root, elle ne se produit tout simplement pas sur le bureau docker - mais se produit en effet dans les boîtes Linux (et les nœuds de construction, bien sûr). Une petite astuce peut "forcer" l'UID actuel dans ce cas (argument -u), donc le problème est traité. Mais tout signifie que je trouve cette approche des ordres de grandeur meilleure. Docker est de toute façon omniprésent, spécialement sur les nœuds de build.
André
1
(suite) La configuration et l'état d'esprit de la vieille école Jenkins mènent à ce genre de chose. Les outils CI / CD modernes font le contraire: vous choisissez simplement un conteneur de build. Mais c'est juste mon opinion.
André