Maven organiza la construcción de un proyecto en un ciclo de vida (lifecycle): una sucesión ordenada de fases. Cuando pides una fase, Maven ejecuta todas las fases anteriores en orden.
Este es el principio más importante que hay que retener:
Pedir una fase ejecuta automáticamente todas las que la preceden.
mvn packagelanza por tanto tambiénvalidate,compileytest.
Maven tiene en realidad tres ciclos de vida:
| Ciclo de vida | Rol |
|---|---|
| default | Construir el proyecto (compile, test, package…) |
| clean | Limpiar (eliminar target/) |
| site | Generar la documentación del proyecto |
# Ejecutar una fase = ejecutar todo hasta ella
mvn package # lanza validate -> compile -> test -> package🔧 Mini-ejercicio — ¿Qué fases se ejecutan cuando lanzas mvn package? Lístalas en orden.
validate → compile → test → package: pedir una fase ejecuta automáticamente todas las que la preceden.
El ciclo de vida default incluye muchas fases; estas son las más usadas en el día a día:
| Fase | Lo que hace |
|---|---|
validate | Verifica que el proyecto es correcto y que está toda la información necesaria |
compile | Compila el código fuente (src/main/java) |
test | Ejecuta las pruebas unitarias |
package | Empaqueta el código compilado (.jar o .war) |
verify | Lanza las pruebas de integración y controles de calidad |
install | Instala el artefacto en el repositorio local ~/.m2 |
deploy | Publica el artefacto en un repositorio remoto compartido |
mvn validate # verificaciones de base
mvn compile # + compilación
mvn test # + pruebas unitarias
mvn package # + creación del artefacto
mvn verify # + pruebas de integración
mvn install # + copia en ~/.m2
mvn deploy # + publicación remotaCuanto más avanzas en la lista, más hace Maven.
mvn installes la «navaja suiza» del desarrollo local: construye todo y deja el artefacto disponible para tus otros proyectos en la misma máquina.
La fase compile transforma tu código Java (src/main/java) en bytecode (.class) colocado en target/classes. Se encarga el plugin Compiler, usando el javac del JDK.
La versión de Java usada se define con las propiedades vistas en la lección 02:
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties># Compilar el código principal
mvn compile
# Compilar también el código de prueba
mvn test-compile🔧 Mini-ejercicio — ¿En qué carpeta se deposita el bytecode .class del código principal después de mvn compile?
En target/classes (por ejemplo target/classes/com/exemple/App.class).
| Propiedad | Rol |
|---|---|
maven.compiler.source | Versión del lenguaje Java aceptada en el código |
maven.compiler.target | Versión del bytecode generado |
Resultado en target/:
target/
└── classes/
└── com/exemple/App.class <-- bytecode compiladoSi la compilación falla (
BUILD FAILURE), Maven se detiene de inmediato: las fases siguientes (test,package) no se ejecutan. Siempre se corrigen primero los errores de compilación.
La fase test ejecuta las pruebas unitarias situadas en src/test/java. Las lanza el plugin Surefire, por lo general con el framework JUnit.
Una prueba JUnit típica:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class CalculTest {
@Test
void additionDeDeuxNombres() {
assertEquals(4, 2 + 2);
}
}# Ejecutar todas las pruebas
mvn test
# Ejecutar una sola clase de prueba
mvn test -Dtest=CalculTest
# Construir SALTANDO las pruebas (a evitar, salvo caso preciso)
mvn package -DskipTests🔧 Mini-ejercicio — Escribe el comando Maven que empaqueta el proyecto sin lanzar las pruebas.
mvn package -DskipTests| Elemento | Rol |
|---|---|
| JUnit | El framework que define y verifica las pruebas |
| Surefire | El plugin Maven que ejecuta las pruebas unitarias |
| Failsafe | El plugin que ejecuta las pruebas de integración (fase verify) |
⚠️ Si una sola prueba falla, todo el build falla (
BUILD FAILURE) y no se produce elpackage. Es intencionado: no se entrega un artefacto cuyas pruebas no pasan. Saltar las pruebas con-DskipTestsdebe seguir siendo excepcional.
La fase package ensambla el código compilado en un artefacto entregable, depositado en target/. El tipo de artefacto depende de la etiqueta <packaging> del pom.xml.
| Packaging | Artefacto | Uso |
|---|---|---|
jar | .jar | Biblioteca o aplicación Java autónoma |
war | .war | Aplicación web desplegada en un servidor (Tomcat…) |
pom | (ninguno) | Proyecto parent/agregador, sin código |
<!-- Elección del tipo de artefacto -->
<packaging>jar</packaging># Producir el artefacto
mvn package
# Localizar el resultado
ls target/Resultado:
target/
├── classes/
├── mon-app-1.0.0-SNAPSHOT.jar <-- el artefacto entregable
└── ...El nombre del artefacto sigue el patrón
artifactId-version.packaging. Ejemplo:mon-app-1.0.0-SNAPSHOT.jar. Ese es el archivo que distribuyes o despliegas.
Después de package, tres operaciones completan el ciclo de vida.
| Comando | Efecto |
|---|---|
mvn install | Construye + copia el artefacto en ~/.m2 (reutilizable en local) |
mvn deploy | Construye + publica el artefacto en un repositorio remoto (Nexus/Artifactory) |
mvn clean | Elimina la carpeta target/ (parte de cero) |
La combinación clean install es una de las más habituales: garantiza un build totalmente limpio.
# Partir de cero y construir todo hasta la instalación local
mvn clean install
# Construir y publicar en el repositorio remoto del equipo
mvn clean deploy| Fase | ¿Quién la necesita? |
|---|---|
install | El desarrollador que quiere reutilizar el artefacto en otro proyecto local |
deploy | El equipo / la CI que publica una versión para todo el mundo |
clean | Quien quiera evitar residuos de un build anterior |
mvn clean installes el reflejo a adoptar cuando «ya no funciona sin motivo»: elcleanelimina posibles archivos compilados obsoletos entarget/.
🔧 Mini-ejercicio — Escribe el comando que parte de un target/ limpio y luego instala el artefacto en el repositorio local ~/.m2.
mvn clean install¿Qué ocurre cuando lanzas mvn package?
a) Solo se ejecuta la fase package
b) Maven ejecuta también todas las fases anteriores (validate, compile, test)
c) Maven publica el artefacto en un repositorio remoto
d) Maven elimina la carpeta target/
✅ Respuesta: b) — Pedir una fase ejecuta todas las fases anteriores en orden: validate → compile → test → package.
¿Qué plugin Maven ejecuta las pruebas unitarias?
a) Compiler
b) Surefire
c) Shade
d) Jar
✅ Respuesta: b) — El plugin Surefire ejecuta las pruebas unitarias (con JUnit) durante la fase test.
¿Qué hace la fase install?
a) Instala Maven en la máquina
b) Copia el artefacto en el repositorio local ~/.m2
c) Publica en Maven Central
d) Elimina target/
✅ Respuesta: b) — install copia el artefacto en ~/.m2, dejándolo reutilizable por otros proyectos locales.
¿Qué etiqueta determina si el proyecto produce un .jar o un .war?
a) <scope>
b) <version>
c) <packaging>
d) <artifactId>
✅ Respuesta: c) — <packaging>jar</packaging> o <packaging>war</packaging> fija el tipo de artefacto que produce package.
¿Qué ocurre durante mvn package si una prueba unitaria falla?
a) El artefacto se produce de todos modos
b) El build falla (BUILD FAILURE) y no se produce el artefacto
c) Maven ignora la prueba
d) Maven pasa directamente a deploy
✅ Respuesta: b) — Una prueba en fallo detiene el build; no se crea el package. Es intencionado: no se entrega un artefacto cuyas pruebas fallan.
package ejecuta también validate, compile y test.install copia el artefacto en ~/.m2.<packaging> decide entre .jar y .war.BUILD FAILURE y no se produce el artefacto.Sobre un proyecto Maven, recorre el ciclo de vida paso a paso: limpia, compila, prueba, empaqueta y luego instala en local. Observa en cada etapa lo que Maven produce en target/.
# 1. Partir de cero: elimina target/
mvn clean
# 2. Compilar: produce target/classes
mvn compile
ls target/classes # bytecode .class presente
# 3. Probar: Surefire ejecuta las pruebas JUnit
mvn test
# 4. Empaquetar: produce el .jar en target/
mvn package
ls target/*.jar # mon-app-1.0.0-SNAPSHOT.jar
# 5. Instalar en el repositorio local ~/.m2
mvn install
# Variante condensada más habitual:
mvn clean installResultado esperado:
[INFO] --- compiler:compile --- (target/classes creado)
[INFO] --- surefire:test --- Tests run: 1, Failures: 0, Errors: 0
[INFO] --- jar:jar --- Building jar: target/mon-app-1.0.0-SNAPSHOT.jar
[INFO] --- install:install --- Installing ... to ~/.m2/repository/...
[INFO] BUILD SUCCESSObserva el orden de las líneas
[INFO]:compile, luegotest, luegojar, luegoinstall. Es la prueba visible de que Maven encadena automáticamente las fases en el orden del ciclo de vida.
validate → compile → test → package → verify → install → deploy.compile (plugin Compiler) produce el bytecode en target/classes.test (plugin Surefire + JUnit) ejecuta las pruebas; un fallo detiene el build.package crea el .jar/.war; install lo copia en ~/.m2; clean vacía target/.Ya dominas Maven: estructura, pom.xml, dependencias y ciclo de vida. El módulo 04 abordará la contenedorización con Docker, donde empaquetarás estos artefactos Maven en imágenes portátiles.
Todos los derechos reservados. Toda reproducción, difusión, uso o adaptación de este curso, en todo o en parte, está estrictamente prohibida sin la autorización escrita previa del Dr. Haythem REHOUMA.
Curso creado por Dr. Haythem REHOUMA — Desarrollo y despliegue de soluciones de datos