Saturday, April 10, 2010

De Maven a Ant sin dejar Maven

En este pequeño post vamos a hacer un ejercicio para convertir un proyecto Maven a un proyecto ANT.

En la compañía donde trabajo (siguenos en twitter @itbrain) usamos como estandar Maven para todos nuestros proyectos ya que hacemos integración continua, ejecutamos pruebas unitarias y obtenemos reportes del avance del proyecto con ayuda de Maven. Sin embargo, hemos tenido clientes a los cuales tenemos que entregarles los proyectos con scripts en ANT (debido a sus propios procesos) para que estos los puedan construir y empaquetar.

A pesar de que hemos recomendado el uso de Maven a nuestros clientes no es posible cambiar los procesos de estos de la noche a la mañana.

Afortunadamente para nosotros existe el plugin de Ant para Maven (http://maven.apache.org/plugins/maven-ant-plugin/index.html) el cual tiene los fabulosos comandos:


  • ant:ant - Para generar los archivos build de Ant.

  • ant:clean - Para limpiar los archivos build de Ant.



los cuales usaremos en este post para hacer el pequeño ejercicio de convertir el proyecto con Maven a scripts de ANT.

Comenzamos creando un proyecto simple en maven:

 
mvn archetype:create -DgroupId=com.jabaddon.practices.maven -DartifactId=maven2ant


Terminada la ejecución de la creación del proyecto agregaremos unas cuantas dependencias al pom.xml para hacer nuestra prueba:

 

org.springframework
spring
2.5.6


log4j
log4j
1.2.15



Ok, el siguiente paso entonces es ejecutar el comando para crear los scripts de ANT:

 
mvn ant:ant


Al terminar la ejecución del comando tendremos 3 nuevos archivos en el proyecto:

 
build.xml
maven-build.properties
maven-build.xml


El archivo build.xml básicamente solo importa al archivo maven-build.xml:










El archivo maven-build.xml es el que tiene los "target" de ant que también tenemos en Maven y son:


    clean - Para limpiar el proyecto.
    compile - Para compilar el proyecto
    compile-tests - Para compilar las pruebas del proyecto (depende de 'compile').
    test - Para ejecutar todas las pruebas del proyecto.
    javadoc - Para generar el javadoc del Proyecto.
    package - Para empaquetar el JAR, WAR, EAR del Proyecto (depende de 'compile' y 'test').


Y por ultimo el archivo maven-build.propeties tiene definidas propiedades que indican cosas como: la ruta del código principal, la ruta del código de pruebas, la ruta hacia las librerías, etc.


project.build.outputDirectory=${maven.build.outputDir}
project.build.directory=${maven.build.dir}
maven.test.reports=${maven.build.dir}/test-reports
maven.build.finalName=maven2ant-1.0-SNAPSHOT
maven.reporting.outputDirectory=${maven.build.dir}/site
maven.build.testResourceDir.0=src/test/resources
maven.build.outputDir=${maven.build.dir}/classes
maven.build.resourceDir.0=src/main/resources
maven.build.testOutputDir=${maven.build.dir}/test-classes
maven.repo.local=${user.home}/.m2/repository
maven.settings.offline=false
maven.build.dir=target
maven.settings.interactiveMode=true
maven.build.testDir.0=src/test/java
maven.build.srcDir.0=src/main/java


Y si tuviésemos la necesidad de agregar mas "target" en la misma pagina del plugin de Ant recomiendan que se agreguen al archivo build.xml y no al maven-build.xml.

2 comments:

Claudia said...

Hola Rafael, muy interesante tu nota acerca de Maven a Ant, lo estamos usando y va de maravilla!

Estamos viendo que, como bien decis en el título del post, no dejas de usar Maven. Es decir, en el archivo maven-build.xml que nos genera la tarea ant:ant vemos que todas las librerias están apuntando al repositorio local de maven.

Como resolvieron eso con los clientes que usan ant y, supongo, que están acostumbrados a tener todas las librerias dentro del empaquetado del proyecto ?

Muchas gracias por compartir tu conocimiento !

Claudia

Rafael Gutiérrez said...

Que tal Claudia,

Que bueno que te haya servido la información en este post.

Sobre tu pregunta: Si, las libreras las entregamos junto con el paquete del proyecto. Pero lo que hice fue crear un folder con una copia del repositorio de maven (solo las librerias que se usan claro) en una ruta relativa al mismo paquete de entrega y modificamos la variable "maven.repo.local" que vienen en los archivos maven-build.xml para que apunte a esta folder.

Gracias por el comentario.

Saludos