Comúnmente creamos nuestros proyectos con el soporte Maven que traen IDEs como Eclipse, IntelliJ IDEA o Netbeans para facilitar las cosas sin ir a los detalles. La idea aquí es ir mas allá, a esos detalles y usarlo de forma manual para aprenderlo mejor.

Aquí tienes una guía de instalación antes de comenzar.

Tareas en el desarrollo

Las tareas mas usadas de forma general son: crear el directorio del proyecto para nuestros archivos(fuentes, imágenes, xml, etc.) y las librerías de terceros, compilar y generar los binarios(.class) en un directorio diferente a los fuentes, ejecutar los test, empaquetar .jar, .war o .ear y desplegar el proyecto si es necesario.

Como nos ayuda Maven con estas tareas?.

Estructura de Directorios

Tan sencillo como crear un directorio para todos nuestros proyectos y de ahí en adelante se encarga maven. Maven establece una estructura de directorios estándar para organizar los archivos del proyecto. Cada proyecto puede contener una estructura como esta:

Ruta Proposito
src/main/java Achivos fuentes
src/main/resources Recursos
src/main/filters Filtros de recursos
src/main/assembly Descriptores de ensamble
src/main/config Archivos de configuración
src/main/scripts Scripts de aplicación
src/main/webapp Contenido de aplicación Web
src/test/java Fuentes para Test
src/test/resources Recursos para Test
src/test/filters Filtros de recursos para Test
src/site Sitio
target/ Proyecto generado
pom.xml Descriptor del proyecto
LICENSE.txt Licencia del Proyecto
NOTICE.txt Notas y atribuciones requeridas por librerías de terceros
README.txt Archivo readme de proyecto


Aunque no todos son necesarios en muchos casos.

Crear un Proyecto

Bien vamos a crear un proyecto directamente con los comandos de maven. Por ahora no entraremos en detalle sobre el comando. En la consola y ubicado sobre tu directorio de proyectos, ejecuta el siguiente comando:

mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=net.ejemplos.ejemplomaven -DartifactId=ejemplo-maven -DinteractiveMode=false


Esto crea un directorio para tu nuevo proyecto con el nombre puesto en el parámetro artifactId, en este caso se llama ejemplo-maven. Al final obtienes un resumen con varios valores y un mensaje de BUILD SUCCESS. En la estructura generada no están todos los directorios mencionados anteriormente. Algunos son opcionales según tu proyecto.

Plugins y Goals

El comando principal de maven es mvn. Este es el encargado de ejecutar las órdenes que le pasemos.

mvn orden_a_ejecutar


La orden a ejecutar puede ser un plugin o una fase del ciclo de vida. Cuando la orden es un plugin, especificamos también un goal de ese plugin. Un goal es una tarea a realizar y se puede personalizar para modificar su comportamiento. Un plugin puede tener varios goal y la sintaxis de ejecución así:

mvn plugin:goal [-Dnombre1=valor1 -Dnombre2=valor2]


Maven esta basado en plugins. Con los plugins es que se realizan las tareas que necesitamos. Crear un archivo jar, crear un archivo war, compilar el código, etc. Esto es lo que permite que sean reutilizados en varios proyectos para ejecutar las tareas comunes. Por ejemplo para compilar ejecutemos la siguiente orden en la raíz del directorio del proyecto ejemplo-maven:

mvn compiler:compile


Hemos ejecutado el goal compile del plugin compiler. Este plugin tiene 2 goal, compile y testCompile. Esto realiza la tarea de compilar las fuentes creando un nuevo directorio llamado target. Maven posee muchos plugins que puedes ver aquí, ahí se detalla los goal que posee cada uno y los parámetros de configuración para cada goal.

Cuando creamos el proyecto usamos el plugin archetype con el goal generate. También le pasamos unos parámetros de la forma -DnombreParametro=valor.

Luego veremos como configurar el comportamiento de los plugins mas en detalle.

Ciclo de Vida

La construcción o generación de un proyecto pasa por varias fases. Tener las librerias de terceros en el classpath, compilar el código fuente, hacer test, empaquetar la aplicación generada, desplegarla en un server y mas. Hacer todo esto paso por paso con plugins y goal no tiene nada de productivo.

Ahí es donde entra en acción el ciclo de vida. Este posee una serie de fases que están predefinidas o se pueden personalizar para realizar todas estas tareas de una vez. Cada fase esta formada por uno o varios goal para lograr un objetivo.

Hay 3 tipos de ciclos de vidas incorporados en maven: default, clean y site.

Default maneja toda la generación y despliegue del proyecto.
Clean limpia el proyecto generado.
Site crea la documentación del proyecto.

Fases de Clean

pre-clean : Operaciones antes de la limpieza.
clean : Remueve todos los archivos generados de la construcción anterior.
post-clean : Procesos necesarios para finalizar la limpieza.

Fases de Site

pre-site : Procesos antes de la generación de documentación.
site : Generación de la documentación del proyecto.
post-site : Procesos después de la generación de documentación y preparación del despliegue de esta.
site-deploy : Despliega la documentación en el servidor web especificado.

Fases de Default

validate : Valida que el proyecto está correcto y esté toda la información necesaria.
initialize : Establece variables y crea directorios.
generate-sources : Genera el código fuente necesario para incluir en el compile.
process-sources : Procesa el código fuente filtrando valores.
generate-resources : Genera recursos a incluir en el empaquetado.
process-resources : Copia y procesa los recursos en el directorio destino.
compile : Compila el código fuente del proyecto.
process-classes : Post-procesamiento a la compilación (ej: manipular el bytecode).
generate-test-sources : Genera el código fuente de testing a incluir en el test-compile.
process-test-sources : Procesa el código fuente de testing filtrando valores.
generate-test-resources : Crea los recursos para test.
process-test-resources : Copia y procesa los recursos en el directorio test de destino.
test-compile : Compila el código fuente de test en el directorio test de destino.
process-test-classes : Post-procesamiento a la compilación de test (ej: manipular el bytecode).
test : Testea el código compilado con el framework especificado.
prepare-package : Operaciones antes de empaquetar.
package : Empaqueta el código compilado en el formato de distribución indicado(jar, war, ear).
pre-integration-test : Operaciones antes de integrar (ej: configurar entorno).
integration-test : Procesa y despliega el paquete si es necesario en un ambiente de integración.
post-integration-test : Operaciones después de la integración (ej: limpiar entorno).
verify : Verifica que el paquete es válido y cumple con criterios de calidad.
install : Instala el paquete en el repositorio local para ser usado como dependencia.
deploy : Integra o despliega en un entorno, copia el paquete a repo remoto para otros desarrolladores.

Al ejecutar una fase se ejecutan también todas las fases previas a esa. Si ejecutamos deploy, se ejecutará todo el ciclo de vida default desde validate. Cada fase del ciclo de vida tiene uno o varios goal asociados a ella. Estos se ejecutan en el orden que va pasando el ciclo de vida. Por ejemplo el goal jar:jar se adjunta a la fase package.

Algunos plugins ejecutados en las fases de ciclo de vida por defecto.

Plugin:Goal Fase
resources:resources process-resources
compiler:compile compile
resources:testResources process-test-resources
surfire:test test (este goal termina el ciclo si falla)
jar:jar package


Lo mismo pasa si obviamos las fases y especificamos los goals directamente uno tras otro:

mvn resources:resources compiler:compile resources:testResources surfire:test jar:jar


También puede ejecutarse los tres tipos ciclos de vida así:

mvn clean deploy site


Maven posee dos formas de manipular las tareas en las fases y como estas se ejecutan.

1. Por el tipo de empaquetado. Para hacer esto es necesario el archivo de configuración del proyecto pom.xml que veremos mas adelante. Por ahora solo tendremos en cuenta que los tipos de empaquetado pueden ser varios. Ej: jar, war, ejb, ear, pom y otros. Si no se especifica el tipo, por defecto es jar. Cada uno de estos tipos de empaquetado especifican las fases que se ejecutan. Por ejemplo para el tipo pom se ejecutan solo install y deploy.

2. Por configuracion de plugins. Los plugins también se configuran en el pom.xml. Ahí se especifican cosas como en cual fase se ejecuta el plugin y determinado goal. Estos se suman a los que se ejecutan de forma predeterminada y el orden puede ser configurado igualmente.

Bien, por ahora lo dejamos aquí.


Franky Villadiego

Volando hacia el desarrollo productivo!