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:
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.