Desarrollo de Plugins para Maven
Con sólo darnos un paseo por las
webs de los más prestigiosos frameworks Open Source
encontraremos que la mayoría coinciden en algo: el logo de
Maven. Y en el mundo del Open Source de calidad no triunfan las modas
sino los resultados: Maven es la herramienta de gestión de la
construcción, despliegue y muchos etcéteras donde el
todo el ciclo de vida está definido por un XML bien llamado
Project Object Model. Este ciclo de vida se define y configura de
acuerdo a las necesidades específicas de nuestro proyecto y
aprovecha la copiosa variedad de plugins disponibles dentro del
proyecto Maven y desarrollados por terceros. Además, Maven
gestiona las dependencias de librerías en el proyecto por lo
que indicando los frameworks a utilizar él se encarga de
descargarlos de Internet así como todos los que cada uno
requiera (por ejemplo: si el proyecto requiere Hibernate y éste
requiere Log4Java entonces también se descarga sin necesidad
de indicarlo explícitamente).
¿Pero todo esto no lo puedo
hacer con Ant? Si, se puede y es válido, pero Ant es un
lenguaje de scripting generalista por lo que cada equipo de
desarrollo termina creando su propio script y se pierde la
reutilización. Además de la gestión de
dependencias, los plugins, etc.
En la sección “Algunos
links interesantes” hay suficientes referencias a material
introductorio como para entender más del tema, ya que lo que
nos ocupa hoy es cómo crear un plugin propio para resover
alguna funcionalidad no contemplada aún.
El primer paso antes de crear un plugin
es googlear lo suficiente como para convencernos de que aún no
está desarrollado. Lo digo muy seriamente porque actualmente
es impresionante la variedad y calidad de plugins disponibles.
Vamos a hacer un ejemplo práctico
de construcción de un plugin y para ello haremos:
-
Creación de un proyecto
Maven para el plugin -
Desarrollo del plugin
-
Configuración en el
proyecto destinatario
Creación de un proyecto Maven para el
plugin
Para crear el proyecto del plugin
utilizaremos Maven (no podría ser de otra manera). Así
que ejecutamos:
mvn
archetype:create -DgroupId=com.autentia.cursos
-DartifactId=ejemplo-maven-plugin
-DarchetypeGroupId=org.apache.maven.archetypes
-DarchetypeArtifactId=maven-archetype-mojo
Veremos que mediante un arquetipo
específico se crea todo lo necesario para comenzar a
desarrollar el plugin.
Desde
la carpeta creada, ejecutamos:
mvn
eclipse:eclipse
Lo cual configurará un proyecto
eclipse
Abrimos
el Eclipse e importamos el proyecto File / Import :
Luego
seleccionamos el proyecto:
Vemos
entonces que el arquetipo nos ha creado un Mojo de ejemplo:
Desarrollo del plugin
¿Mojo? Si, un Maven Old Java
Object. Siguiendo las últimas tendencias, estas clases
austeras y minimalistas nos facilitan mucho la vida. El mojo de
ejemplo toma como parámetro el outputDirectory que por defecto
tendrá el valor de la carpeta del proyecto (aunque podríamos
modificarlo como veremos más adelante) y crea un fichero de
texto.
Los parámetros se definen muy
fácilmente:
/** * My String. * * @parameter default-value="Hello World!" */ private String myString;
Y no requieren getters, setters ni nada
más.
Adentro del execute es donde
desarrollamos el código que resuelve la funcionalidad de
nuestro plugin, donde contaremos con métodos muy útiles
e intuitivos como:
-
getLog()
-
getPluginContext()
Cabe aclarar que si se lanza una
MojoExecutionException se lanzará un mensaje BUILD ERROR
detendrá el ciclo de vida de Maven pero si se lanza un
MojoFailureException se lanzará un mensaje “BUILD
FAILURE” aunque continuará con el ciclo de vida.
Para poder publicar nuestro plugin
debemos configurar nuestro repositorio en el pom.xml:
autentia-repository autentia-repository file:c:/java/maven/localRepository/autentia-repository autentia-snapshotRepository autentia-snapshotRepository file:c:/java/maven/localRepository/autentia-snapshotRepository
Finalmente, se debe lanzar un:
mvn deploy
Con esto, compilaremos, empaquetaremos
y publicaremos el plugin:
Ahora
sólo nos queda utilizarlo!
Configuración en el proyecto destinatario
Simplemente, abrimos el pom.xml y añadimos nuestro
repositorio:
... autentia-repository autentia-repository file:c:/java/maven/localRepository/autentia-repository ... autentia-snapshotRepository autentia-snapshotRepository file:c:/java/maven/localRepository/autentia-snapshotRepository
Luego configuramos el plugin:
... ... ... com.autentia.cursos ejemplo-maven-plugin 1.0-SNAPSHOT compile touch
En este caso hemos suscripto el plugin
al ciclo de vida para que en la fase de compilación ejecute el
goal “touch”, pero podríamos hacerlo con otras
fases como podemos ver en
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html.
Finalmente, indicamos la dependencia:
...... ...... com.autentia.cursos ejemplo-maven-plugin 1.0-SNAPSHOT maven-plugin
Si ejecutamos una compilación
con:
mvn compile
Veremos:
Y el plugin habrá creado el
fichero indicado en /target/touch.txt.
Algunos links interesantes
-
Maven, nunca antes resultó tan fácil compilar,
empaquetar,…
https://adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=maven -
Maven: The Definitive Guide,
http://www.sonatype.com/book/index.html -
The Maven 2 tutorial: A practical guide for Maven 2 users,
http://docs.codehaus.org/display/MAVENUSER/The+Maven+2+tutorial
Conclusiones
Extender Maven mediante plugins es una
tare sencilla, aunque requiere de conocimientos completos sobre el
funcionamiento de Maven, sus repositorios, configuración, etc.
Pero las ventajas de implementar Maven bien valen la pena.
Desde Autentia contamos con los
conocimientos y experiencia para ayudarle a aplicar técnicas
de ingeniería de software para automatizar y mejorar la
calidad de sus desarrollos software.
No dude en contactarse con nosotros
mediante www.autentia.com .