¿mvn o ./mvnw? La clave para un Maven consistente

Entiende por qué los archivos mvnw y mvnw.cmd son esenciales en tus proyectos Spring Boot y cómo te ahorran dolores de cabeza con las versiones de Maven. Simplicidad que funciona.

En el desarrollo con Maven, especialmente en proyectos Spring Boot, es común ver un par de archivos, mvnw y mvnw.cmd, en la raíz del proyecto. Para muchos que vienen de otras tecnologías o que recién empiezan con Maven, esto puede ser una incógnita. ¿Por qué usarlos en vez del clásico mvn que ya tengo instalado?

La diferencia es crucial y, de hecho, me ha salvado de varios problemas. Básicamente, estos archivos son parte del Maven Wrapper. Su propósito es simple y potente: te permiten ejecutar el proyecto Maven sin necesidad de tener Maven instalado globalmente en tu sistema.

Imagínate un equipo de desarrollo donde cada uno tiene una versión distinta de Maven, o un servidor de integración continua que necesita una configuración específica. Si confías en la instalación global de mvn, estás a merced de la configuración de cada ambiente. Esto me costó un bug a las 2 AM una vez, con un pipeline de CI que fallaba por una incompatibilidad de versiones que nadie había detectado localmente. Desde ahí, mi regla es clara: usar siempre el wrapper.

El mvnw (para sistemas basados en Bash como Linux o macOS) y mvnw.cmd (para Windows) se encargan de descargar automáticamente la versión de Maven que el proyecto necesita, si no la encuentra. Esta versión se guarda en tu directorio de usuario, específicamente en ~/.m2/wrapper. Así, te aseguras de que todos en el equipo y en tus entornos de CI/CD estén usando exactamente la misma versión, eliminando la clásica excusa del "en mi máquina funciona".

¿Cómo sabe qué versión descargar?

La magia ocurre gracias al archivo .mvn/wrapper/maven-wrapper.properties. Dentro de él, encuentras la URL de dónde debe descargar el Maven. Por ejemplo:

distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip

Para mí, la gracia está en la consistencia. Si un proyecto requiere Maven 3.6.3 y otro Maven 3.8.7, el wrapper lo gestiona sin que tengas que instalar y cambiar versiones manualmente en tu PATH. Es una solución simple que funciona, sin sobreingeniería.

Generar o Actualizar el Wrapper

Si tu proyecto no tiene el wrapper o quieres actualizar la versión de Maven que usa, puedes generarlo o actualizarlo. Necesitas tener Maven instalado globalmente solo para el comando de generación inicial. Después, ya no.

Para generarlo o actualizarlo a una versión específica, puedes usar:

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

Ojo que el -N es importante para proyectos multimodule, asegurando que se genere en la raíz y no en cada submódulo. Si prefieres, también puedes editar directamente el maven-wrapper.properties para cambiar la distributionUrl. Yo prefiero el comando, es menos propenso a errores tipográficos.

Mi recomendación

Siempre que inicies un proyecto Maven, asegúrate de que incluya el wrapper. Esto te va a ahorrar muchos dolores de cabeza a ti y a tu equipo. Usa ./mvnw (o ./mvnw.cmd) en lugar de mvn para todas tus operaciones. Es una práctica estándar que simplifica la configuración del entorno y garantiza que todos trabajen con las mismas herramientas.

Jorge RequenaDeveloper full-stack · Chile