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:
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.
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í:
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:
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:
También puede ejecutarse los tres tipos ciclos de vida así:
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í.