Maven
¿Qué es Maven?
Maven es una herramienta de gestión de proyectos que:
- Gestiona dependencias: Descarga automáticamente bibliotecas
- Compila proyectos: Estructura estándar de directorios
- Ejecuta tests: Integración con JUnit
- Empaqueta aplicaciones: Genera JARs, WARs
- Gestiona el ciclo de vida: Build, test, deploy
Instalación
Linux
# Ubuntu/Debiansudo apt install maven
# Archsudo pacman -S maven
# Verificarmvn -versionmacOS
brew install mavenWindows
Descarga desde maven.apache.org y agrega al PATH.
pom.xml
El archivo pom.xml (Project Object Model) configura el proyecto.
POM básico
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.empresa</groupId> <artifactId>mi-proyecto</artifactId> <version>1.0.0</version> <packaging>jar</packaging>
<properties> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties></project>Coordenadas Maven
Identifican una dependencia:
- groupId: Identifica la organización (
com.empresa) - artifactId: Nombre del proyecto (
mi-proyecto) - version: Versión (
1.0.0)
Juntos forman: com.empresa:mi-proyecto:1.0.0
Dependencias
Agregar dependencia
<dependencies> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.10.0</version> <scope>test</scope> </dependency></dependencies>Scopes
- compile (por defecto): Disponible en compile, test y runtime
- test: Solo para tests
- provided: Proporcionado por el contenedor (ej: servlets)
- runtime: Solo en runtime, no en compile
Buscar dependencias
Maven Central - Busca bibliotecas y obtén las coordenadas.
Ejemplo: Buscar "jackson" → Copiar dependencia:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.16.0</version></dependency>Comandos Maven
Limpiar
mvn cleanElimina el directorio target/.
Compilar
mvn compileCompila el código fuente.
Ejecutar tests
mvn testEmpaquetar
mvn packageGenera JAR/WAR en target/.
Instalar localmente
mvn installInstala el artefacto en el repositorio local (~/.m2/repository/).
Ciclo completo
mvn clean installCiclo de vida
Maven tiene 3 ciclos:
default
validate → compile → test → package → verify → install → deployclean
pre-clean → clean → post-cleansite
pre-site → site → post-site → site-deployEjecutar una fase ejecuta todas las anteriores.
Plugins
Plugin de compilación
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>21</source> <target>21</target> </configuration> </plugin> </plugins></build>Plugin ejecutable
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <configuration> <mainClass>com.empresa.Main</mainClass> </configuration></plugin>Ejecutar:
mvn exec:javaJAR ejecutable
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>com.empresa.Main</mainClass> </manifest> </archive> </configuration></plugin>Genera JAR ejecutable:
mvn packagejava -jar target/mi-proyecto-1.0.0.jarPerfiles
Para diferentes configuraciones (dev, test, prod):
<profiles> <profile> <id>dev</id> <properties> <env>development</env> </properties> </profile> <profile> <id>prod</id> <properties> <env>production</env> </properties> </profile></profiles>Activar:
mvn clean install -PprodGestión de versiones
Properties
<properties> <junit.version>5.10.0</junit.version></properties>
<dependencies> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>${junit.version}</version> </dependency></dependencies>Dependency Management
En proyectos multi-módulo, centraliza versiones:
<dependencyManagement> <dependencies> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.10.0</version> </dependency> </dependencies></dependencyManagement>Los módulos hijos solo especifican groupId y artifactId.
Repositorios
Repositorio local
~/.m2/repository/ - Maven guarda dependencias aquí.
Maven Central
Repositorio por defecto. No necesita configuración.
Repositorios personalizados
<repositories> <repository> <id>mi-repo</id> <url>https://repo.empresa.com/maven</url> </repository></repositories>Proyecto multi-módulo
mi-aplicacion/├── pom.xml (padre)├── core/│ └── pom.xml└── web/ └── pom.xmlpom.xml padre:
<project> <groupId>com.empresa</groupId> <artifactId>mi-aplicacion</artifactId> <version>1.0.0</version> <packaging>pom</packaging>
<modules> <module>core</module> <module>web</module> </modules></project>core/pom.xml:
<project> <parent> <groupId>com.empresa</groupId> <artifactId>mi-aplicacion</artifactId> <version>1.0.0</version> </parent>
<artifactId>core</artifactId></project>Buenas prácticas
- Usa properties para versiones: Facilita actualizaciones.
- No commitees target/: Agrega a
.gitignore. - Especifica versiones exactas: Evita sorpresas.
- Usa dependency management en multi-módulo.
- Mantén pom.xml limpio: Ordena dependencias alfabéticamente.
Próximo paso
Aprende sobre Gradle: Gradle →