¿Cuál es el propósito de los archivos mvnw y mvnw.cmd?

257

Cuando creé una aplicación Spring Boot pude ver mvnwy mvnw.cmdarchivos en la raíz del proyecto. ¿Cuál es el propósito de estos dos archivos?

shaunthomas999
fuente

Respuestas:

345

Estos archivos son del contenedor Maven . Funciona de manera similar al envoltorio Gradle .

Esto le permite ejecutar el proyecto Maven sin tener Maven instalado y presente en la ruta. Descarga la versión correcta de Maven si no se encuentra (por lo que sé por defecto en su directorio de inicio de usuario).

El mvnwarchivo es para Linux (bash) y mvnw.cmdes para el entorno de Windows.


Para crear o actualizar todos los archivos necesarios de Maven Wrapper, ejecute el siguiente comando:

mvn -N io.takari:maven:wrapper

Para usar una versión diferente de maven, puede especificar la versión de la siguiente manera:

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

Ambos comandos requieren experta en PATH(añadir la ruta a maven binque Pathen las variables del sistema) si ya tiene mvnw en su proyecto puede utilizar ./mvnwen lugar de mvnen los comandos.

Esquivar
fuente
Tu respuesta es muy útil. Reviso la documentación del envoltorio de Maven. Estaba usando el mvncomando para la operación maven, aunque podría usarlo ./mvnwpara el mismo propósito.
shaunthomas999
2
Gracias por la respuesta. ¿Puedes explicar cuándo se genera esto, como cuando creas inicialmente un proyecto? ¿Se actualizará a lo largo de la línea cuando realice cambios en su pom como agregar eliminar dependencias / complementos?
Asanke
1
y, ¿debería agregar / confirmar los archivos mvnw.cmd?
jpganz18
sí, por supuesto. le permite ejecutar rápidamente su compilación maven sin la necesidad de instalar maven adicional o tenerlo en PATH.
Dodge
1
Muchas gracias por la respuesta, es muy útil. ¿Podría decirnos algo sobre la portabilidad de los archivos de configuración de Maven cuando trabajamos de esa manera? Saludos y gracias de nuevo.
Daniel Hernández el
26

Command mvnwusa Maven que se descarga por defecto ~/.m2/wrapperen el primer uso.

La URL con Maven se especifica en cada proyecto en .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

Para actualizar o cambiar la versión de Maven, invoque lo siguiente (recuerde --non-recursivepara proyectos de varios módulos):

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

o simplemente modificar .mvn/wrapper/maven-wrapper.propertiesmanualmente.

Para generar un envoltorio desde cero utilizando Maven (necesita tenerlo ya en PATHejecución:

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

El Maven Envoltura es una excelente opción para proyectos que necesitan una versión específica de Maven (o para los usuarios que no deseen instalar Maven en absoluto). En lugar de instalar muchas versiones de él en el sistema operativo, podemos usar el script de envoltura específico del proyecto.

mvnw: es un script ejecutable de shell Unix utilizado en lugar de un Maven completamente instalado

mvnw.cmd : es para el entorno de Windows


Casos de uso

El contenedor debería funcionar con diferentes sistemas operativos como:

  • Linux
  • OSX
  • Ventanas
  • Solaris

Después de eso, podemos ejecutar nuestros objetivos de esta manera para el sistema Unix:

./mvnw clean install

Y el siguiente comando para Batch:

./mvnw.cmd clean install

Si no tenemos el Maven especificado en las propiedades del contenedor, se descargará e instalará en la carpeta $USER_HOME/.m2/wrapper/distsdel sistema.


Complemento Maven Wrapper

Complemento Maven Wrapper para realizar la instalación automática en un simple proyecto Spring Boot.

Primero, debemos ir a la carpeta principal del proyecto y ejecutar este comando:

mvn -N io.takari:maven:wrapper

También podemos especificar la versión de Maven:

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

La opción -N significa –no-recursivo para que el contenedor solo se aplique al proyecto principal del directorio actual, no en ningún submódulo.

Patel Romil
fuente
2

Con mucho, la mejor opción hoy en día sería utilizar un contenedor Maven como herramienta de construcción. Un mvn.shguión como este sería suficiente:

#!/bin/bash
docker run --rm -ti \
 -v $(pwd):/opt/app \
 -w /opt/app \
 -e TERM=xterm \
 -v $HOME/.m2:/root/.m2 \
 maven mvn "$@"
André
fuente
77
Esto no responde a la pregunta de OP, solo sugiere una alternativa
ahmedjaad
2
La idea muy básica de maven wrapper es declarar la versión correcta de maven para este proyecto. Y una ventaja es evitar la necesidad de instalar manualmente Maven. Su enfoque no solo falla para resolver el problema de la versión, sino que requiere una herramienta más instalada localmente.
Max
2
También tenga en cuenta que esto monta los repositorios locales de Maven de los usuarios en la instancia de Docker. Por lo general, esto se ejecuta como root, por lo que todo lo escrito por la instancia maven dockerizada es propiedad de root en Linux. Esto no es necesariamente deseable. Descubrí que una instancia de nexus correctamente configurada y accesible para la instancia de compilación de Docker fue menos dolorosa, especialmente si desea compilaciones reproducibles.
Thorbjørn Ravn Andersen
Eso fue hace mucho tiempo, pero todavía prefiero de esta manera. Acerca de la versión de Maven, las etiquetas de imagen lo proporcionan (solo mire la página de Maven en Docker Hub). En cuanto a la propiedad de la raíz, simplemente no sucede en el escritorio de la ventana acoplable, sino que sucede en cajas de Linux (y nodos de compilación, por supuesto). Un pequeño truco puede "forzar" el UID actual en este caso (argumento -u), por lo que se maneja el problema. Pero todo significa que encuentro este orden de órdenes de magnitud mejor. Docker está omnipresente de todos modos, especialmente en los nodos de compilación.
André
1
(continúa) La configuración y la mentalidad de la vieja escuela Jenkins conducen a este tipo de cosas. Las herramientas modernas de CI / CD hacen lo contrario: simplemente elige un contenedor de compilación. Pero esa es solo mi opinión.
André