Proteger tus Recursos
Normalmente los ficheros .class se cargan desde el classpath. Y los otros tipos de ficheros (recursos) también se cargan desde el classpath, utilizando los distintos métodos getResource. Si quieres evitarte tener que borrar esos recursos cada vez que invocas el goal clean, necesitas almacenar los recursos fuera del directorio de clases y copiarlos al directorio de clases como parte del proceso de construcción. Maven tiene un goal para este propósito llamado jar-resources. Que no comprime nada, sólo copia los recursos al directorio target/classes. Maven llama automáticamente a este goal cuando ejecutas el goal jar.
Primero, necesitamos decirle a Maven, dónde estar los ficheros de recursos:
- Añade el elemento resources al fichero project.xml como se muestra abajo:
...
</unitTest>
<resources>
<resource>
<directory>
${basedir}/src/conf
</directory>
</resource>
</resources>
</build>
...
- Sitúa un fichero de recurso, digamos box.properties, en <project_home>/src/conf.
- Ejecuta el goal jar, que indirectamente ejecuta el goal jar-resources:
maven jar
Mira en la carpeta target/classes. Deberías ver que Maven ha copiado box.properties desde src/conf a target/classes.
Crear Goals y Plug-ins
Al igual que Ant, Maven nos permite crear nuestros propios goals. Podemos utilizar los goals de Maven en distintos niveles:
- Usar un goal existente tal y como és.
- Extender un goal existente.
- Crear nuestro propio goal a nivel de proyecto.
- Crear un goal multi-proyecto creando un plug-in Maven.
Goals Específicos del Proyecto
Los goals específicos de proyecto se definen en un fichero llamado maven.xml, que es muy parecido al build.xml de Ant. Aquí están los pasos para crear un goal específico de proyecto en Maven:
- Crea un fichero llamado maven.xml en el directorio raíz del proyecto:
c:\daven\maven.xml
- Añadele el siguiente fragmento de XML:
<project>
<goal name="myGoal-1">
<mkdir dir="c:\myFolder"/>
<echo>Hello Maven</echo>
</goal>
</project>
- Invoca el goal:
maven myGoal-1
Como has podido ver, con maven.xml, Maven puede actuar exactamente igual que Ant (De echo, mkdir es una tarea Ant). Maven puede ejecutar cualquier tarea Ant, y también soporta la mayoría de las etiquetas JSTL, lo que le proporciona lógica básica y funcionalidades de bucles. Por ejemplo, si quieres crear un goal que cree cinco directorio, podrías utilizar esto:
<goal name="myGoal-2">
<c:forEach begin="1" end="5" indexVar="i">
<mkdir dir="c:\myFolder${i}"/>
<echo>${i}</echo>
</c:forEach>
</goal>
El fichero maven.xml realmente es un script Jelly. Jelly es un lenguaje de script de propósito general, basado en XML. Maven lo utiliza, pero no es específico de Maven.
| Jelly = XML Ejecutable |
|
Podrías utilizar el motor Rhino JavaScript o Jython para crear una aplicación que proporcione capacidades de script para los usuarios finales. Sin embargo, una alternativa atractiva es Jelly, un lenguaje de script basado en XML de Apache. Jelly es una tecnología de propósito general que permite a los desarrolladores añadir capacidades de script a sus aplicaciones Java. Aquí puedes ver algunas de las características que lo hacen tan atractivo:
- Su síntaxis está basada en XML, que és ampliamente conocido y soportado.
- Puedes ampliarlo fácilmente creando tus propias etiquetas.
- Proporciona un gran conjunto de librerías de etiquetas, incluyendo algunas que imitan a JSTL y tareas Ant.
- Soporta un superconjunto de JSPs EL (expression language).
Maven utiliza Jelly como lenguaje de script, pero Jelly es un producto independiente y no está unido a Maven. La site de Jelly lo describe como XML ejecutable, similar a las tareas Ant o a las etiquetas JSP personalizadas pero de propósito más general.
Para más información sobre Jelly, visita http://jakarta.apache.org/commons/jelly.
|
Extender un Goal
Puedes extender un goal existente de forma específica para el proyecto definiendo elementos preGoal y/o postGoal en maven.xml. Por ejemplo, si estás contento con el goal interno de Maven clean pero te gustaría que Maven también limpiara el caché temporal de tu servidor de aplicaciones, podrías extender el goal clean con un elemento postGoal. Mi servidor de aplicaciones, Caucho Resin, utiliza un directorio llamado WEB-INF/work para sus ficheros temporales. Intenta añadir el siguiente bloque de código a maven.xml:
<postGoal name="clean:clean">
<delete dir="${basedir}/WEB-INF/work"/>
<echo>Deleted Resin work directory</echo>
</postGoal>
Luego ejecuta de nuevo el goal clean:
maven clean
Goals Multi-Proyecto (Plug-ins)
Maven te permite crear goals genéricos reutilizables, que en mi opinión son los que lo hacen más útil. En comparación, Ant soporta tareas reutilizables, pero no targets reutilizables. Para crear un goal reutilizable, necesitas crear un plug-in.
Como ejemplo, yo utilizo Kodo de Solarmetric, una herramienta de mapeo objeto/relacional compatible JDO. JDO es una gran tecnología, pero añade un paso extra al proceso de construcción. Específicamente, tienes que ejecutar una tarea independiente que añade las funcionalidades de persistencia a tus ficheros de clases (JDO se refiere a esto como mejora de byte-codes). Afortunadamente, puedes llamar al mejorador de bytes-codes desde un goal de Maven. Y como yo utilizo Kodo en varios proyectos, es un gran candidato para un goal multi-proyecto, en otras palabras, para ser un plug-in.
Por motivos de simplicidad, empecemos con un plug-in "hello World" ligeramente menos ambiguo. Realiza los siguientes pasos para crear un plug-in de Maven mínimo:
- Crear un directorio para el plug-in:
<USER_HOME>\.maven\plugins\maven-hello-plugin-1.0
- Crea el fichero plugin.jelly con el nombre <USER_HOME>\.maven\plugins\maven-hello-plugin-1.0\plugin.jelly y con este contenido:
<project>
<goal name="hello">
<echo>Hello Maven Plug-in!</echo>
</goal>
</project>
- Crea un fichero project.xml mínimo dentro de la carpeta del plug-in: <USER_HOME>\.maven\plugins\maven-hello-plugin-1.0\project.xml y con este contenido:
<project></project>
Este fichero project.xml obviamente no añade ningún valor a tu plug-in, y lógicamente tu no lo necesitas. Pero Maven dará un mensaje de error si no se lo proporcionas. Los plug-ins más sofisticados hacen uso de este fichero para extender el POM con configuraciones específicas del plug-in.
- Llama al nuevo plug-in:
maven hello
¡Has completado tu primer plug-in!
Más que una Herramienta de Construcción
Aunque he descrito y utilizado Maven como una herramienta de construcción, realmente es más que eso. La site de Maven lo describe como "una herramienta de control y comprensión de proyectos Java". Por ejemplo, el POM (project.xml) tiene etiquetas para especificar nombres de desarrolladores, sus direcciones de correo, la fecha de inicio del proyecto, etc. Goals como site:generate utilizarán esa información para auto-generar una site web para documentar tu proyecto.
Recuerda que el poder de Maven está en sus plug-ins. Por eso, pierde algo de tiempo explorando todos los plug-ins y goals que proporciona. Si utilizas grandes scripts de construcción y estás cansado de copiar-y-pegar, Maven y su larga lista de plug-ins te harán la vida más fácil.