Qual è lo scopo dei file mvnw e mvnw.cmd?


257

Quando ho creato un'applicazione Spring Boot ho potuto vedere mvnwe mvnw.cmdfile nella radice del progetto. Qual è lo scopo di questi due file?

Risposte:


345

Questi file provengono dal wrapper Maven . Funziona in modo simile al wrapper Gradle .

Ciò consente di eseguire il progetto Maven senza che Maven sia installato e presente sul percorso. Scarica la versione Maven corretta se non viene trovata (per quanto ne so per impostazione predefinita nella directory home dell'utente).

Il mvnwfile è per Linux (bash) e mvnw.cmdper l'ambiente Windows.


Per creare o aggiornare tutti i file Maven Wrapper necessari, eseguire il comando seguente:

mvn -N io.takari:maven:wrapper

Per utilizzare una versione diversa di Maven è possibile specificare la versione come segue:

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

Entrambi i comandi richiedono maven su PATH(aggiungi il percorso a maven binsu Pathsu Variabili di sistema) se hai già mvnw nel tuo progetto che puoi usare ./mvnwinvece che mvnnei comandi.


La tua risposta è molto utile Controllo la documentazione del wrapper Maven. Stavo usando il mvncomando per l'operazione maven ma potevo usare ./mvnwper lo stesso scopo.
shaunthomas999,

2
Grazie per la risposta. Puoi spiegarci quando questo viene generato, come quando inizialmente crei un progetto? Verrà aggiornato lungo la linea quando si apportano modifiche al proprio pom come aggiungere rimuovere dipendenze / plugin?
Asanke,

1
e, dovresti aggiungere / eseguire il commit dei file mvnw.cmd?
jpganz18,

sì, naturalmente. ti permette di eseguire rapidamente la tua build maven senza la necessità di installare extra maven su PATH.
Dodge

1
Mille grazie per la risposta, è molto utile ¿Potresti dirci qualcosa sulla portabilità dei file delle impostazioni di Maven quando lavoriamo in quel modo? Saluti e grazie ancora.
Daniel Hernández,

26

Il comando mvnwutilizza Maven che viene scaricato per impostazione predefinita al ~/.m2/wrapperprimo utilizzo.

L'URL con Maven è specificato in ciascun progetto su .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

Per aggiornare o modificare la versione di Maven invocare quanto segue (ricordare --non-recursiveper i progetti multi-modulo):

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

o semplicemente modificare .mvn/wrapper/maven-wrapper.propertiesmanualmente.

Per generare un wrapper da zero utilizzando Maven (devi averlo già in PATHesecuzione:

mvn io.takari:maven:wrapper -Dmaven=3.3.9 

5

Il Maven Wrapper è una scelta eccellente per i progetti che hanno bisogno di una specifica versione di Maven (o per gli utenti che non vogliono installare Maven a tutti). Invece di installarne molte versioni nel sistema operativo, possiamo semplicemente usare lo script wrapper specifico del progetto.

mvnw: è uno script di shell Unix eseguibile usato al posto di un Maven completamente installato

mvnw.cmd : è per ambiente Windows


Casi d'uso

Il wrapper dovrebbe funzionare con diversi sistemi operativi come:

  • Linux
  • OSX
  • finestre
  • Solaris

Successivamente, possiamo raggiungere i nostri obiettivi in ​​questo modo per il sistema Unix:

./mvnw clean install

E il seguente comando per Batch:

./mvnw.cmd clean install

Se non abbiamo il Maven specificato nelle proprietà del wrapper, verrà scaricato e installato nella cartella $USER_HOME/.m2/wrapper/distsdel sistema.


Plug-in Maven Wrapper

Plug- in Maven Wrapper per effettuare l'installazione automatica in un semplice progetto Spring Boot.

Innanzitutto, dobbiamo andare nella cartella principale del progetto ed eseguire questo comando:

mvn -N io.takari:maven:wrapper

Possiamo anche specificare la versione di Maven:

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

L'opzione -N significa –non-ricorsivo in modo che il wrapper verrà applicato solo al progetto principale della directory corrente, non in alcun sottomodulo.


2

Di gran lunga la migliore opzione al giorno d'oggi sarebbe usare un contenitore Maven come strumento di costruzione. Una mvn.shsceneggiatura come questa sarebbe sufficiente:

#!/bin/bash
docker run --rm -ti \
 -v $(pwd):/opt/app \
 -w /opt/app \
 -e TERM=xterm \
 -v $HOME/.m2:/root/.m2 \
 maven mvn "$@"

7
Questo non risponde alla domanda del PO, suggerisce solo un'alternativa
ahmedjaad,

2
L'idea di base di Maven Wrapper è dichiarare la versione corretta di Maven per questo progetto. E un bonus sta evitando la necessità di installare manualmente Maven. Il tuo approccio non solo manca di risolvere il problema di versione, ma richiede uno strumento più installato localmente.
Max

2
Si noti inoltre che questo monta il repository Maven locale dell'utente nell'istanza docker. In genere questo funziona come root, quindi tutto ciò che è scritto dall'istanza di Maven Docker è di proprietà di root in Linux. Questo non è necessariamente desiderabile. Ho trovato un'istanza nexus correttamente configurata accessibile all'istanza build docker era meno dolorosa, specialmente se desideri build riproducibili.
Thorbjørn Ravn Andersen,

È stato tanto tempo fa, ma preferisco ancora così. A proposito della versione maven, i tag immagine lo forniscono (basta guardare la pagina maven in Docker Hub). Per quanto riguarda la proprietà di root, ciò non accade sul desktop docker, ma in effetti accade nelle caselle Linux (e ovviamente costruisce nodi). Un piccolo trucco può "forzare" l'UID corrente in questo caso (argomento -u), quindi il problema viene gestito. Ma tutto ciò significa che trovo meglio questo approccio con ordini di grandezza. Docker è onnipresente comunque, specialmente sui nodi build.
André,

1
(continua) L'impostazione e la mentalità di Jenkins della vecchia scuola portano a questo tipo di cose. I moderni strumenti CI / CD fanno il contrario: basta scegliere un contenitore di build. Ma questa è solo la mia opinione.
André,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.