Cuando construimos aplicaciones complejas debemos tratar de automatizar los máximo posible tareas mecánicas como:
- Extracción de fuentes de un repositorio (por ejemplo CVS)
- Compilación de nuestros fuentes
- Creación de los ficheros temporales
- Empaquetamiento de binarios para distintos entornos (publico, privado, intranet, etc.)
- Construcción de componentes complejos (como EJBs)
- Ejecución de pruebas unitarias
- Generación de la documentación
- Despliegue de componentes
- Borrado de ficheros temporales
- Y muchas cosas más
Para esto, podemos utilizar ANT (ver tutorial) e incluso otras opciones que van a dar mucho que hablar como MAVEN (tenemos un tutorial en el horno).
Para trabajar con ANT, podemos hacerlo a mano o utilizar herramientas especificas como Antelope o las características avanzadas de nuestros entornos habituales (NetBeans en nuestro caso)
Antelope forma parte de www.Tigris.org que viene a ser como www.sourceforge.org (repositorio de proyectos abiertos) pero un poquito más acotado….
Podemos ir al Web y acceder al link de la guía, que es sorprendentemente buena…
http://antelope.tigris.org/nonav/docs/manual/index.html
En el área de Documents & Files podemos descargarnos los binarios
Y, estando seguros de tener instalado ANT, podemos ejecutar el comando para arrancar nuestra herramienta.
ant -f run.xml
C:javaAntelopeApp_3.1.8>dir Volume in drive C has no label. Volume Serial Number is 7C92-5811 Directory of C:javaAntelopeApp_3.1.8 06/15/2004 08:37a <DIR> . 06/15/2004 08:37a <DIR> .. 06/06/2004 04:07a 808,495 AntelopeApp_3.1.8.jar 06/06/2004 04:07a 21,663 ChangeLog.txt 06/06/2004 04:07a 350 install.txt 06/06/2004 04:07a 2,258 license.txt 05/07/2004 08:23p 2,363 run.xml 5 File(s) 835,129 bytes 2 Dir(s) 15,535,435,776 bytes free C:javaAntelopeApp_3.1.8>echo %ANT_HOME% C:javaapache-ant-1.6.1 C:javaAntelopeApp_3.1.8>ant -f run.xml |
Nos aparece un menú gráfico donde podemos, de un modo bastante intuitivo, gestionar nuestros ficheros ANT (normalmente con el nombre build.xml)
Vamos a abrir uno de los build.xml reales que hemos utilizado anteriormente en este Web (EJB´s y Orion )
Podemos ver, a través del árbol de navegación, las distintas tareas y sus atributos.
Cambiando de lengüeta podemos ejecutar directamente los comandos.
Una de las cosas más simples pero que más nos ayuda es la sintaxis personaliza con colores.
Uno de mis entornos favoritos para el trabajo es NetBeans (para impartición de cursos porque para el trabajo en proyectos me parece igual o incluso mejor eclipse). Dentro de NetBeans, tenemos capacidades avanzadas de creación y ejecución de Scripts ANT y os vamos a mostrar lo sencillo que es
Creamos un nuevo proyecto (y asociamos el filesystem deseado, pinchando con el botón derecho sobre el proyecto creado)
Elegimos el nuevo tipo de elemento a insertar
Elegimos las relacionadas con Ant (si no las veis, ejecutar el Tools->Update para que se conecte al Web de NetBeans )
Elegimos el nombre del Script
Y se nos genera automáticamente algo como esto.
<?xml version="1.0" encoding="UTF-8"?> <!– Written to assume that classpath is rooted in the current directory. –> <!– So this should be OK if you make this script in the root of a filesystem. –> <!– If not, you may prefer to adjust the basedir, or move some directories around. –> <!– The idea is that both Ant and NetBeans have to know what the package root is –> <!– for the classes in your application. –> <project basedir="." default="all" name="myapp"> <!– Don't worry if you don't know the Ant syntax completely or need help on some tasks! –> <!– The standard Ant documentation can be downloaded from AutoUpdate and –> <!– and then you can access the help in menu Help | Help Sets | Ant 1.5.1 Manual. –> <target name="init"> <!– You can set up any variables you want used throughout the script here. –> <property name="hello" value="world"/> <!– To use e.g. Jikes, uncomment this line. –> <!– (Or make the same change in Tools | Options | Ant Settings | Properties.) –> <!– <property name="build.compiler" value="jikes"/> –> <!– You might like to set up some overridable paths, etc.: –> <!– <property name="mylib" value="../lib/mylib.jar"/> –> </target> <target depends="init" name="compile"> <!– Both srcdir and destdir should be package roots. –> <!– They could be different of course; in that case NetBeans can also be set –> <!– up to compile to a different filesystem in the same way; see Compiler Types: –> <javac debug="true" deprecation="true" destdir="." srcdir="."> <!– To add something to the classpath: –> <!– <classpath><pathelement location="${mylib}"/></classpath> –> <!– To exclude some files: –> <!– <exclude name="com/foo/SomeFile.java"/><exclude name="com/foo/somepackage/"/> –> </javac> </target> <target depends="init,compile" name="jar"> <!– To make a standalone app: –> <!– 1. Create a myapp.mf manifest somewhere. –> <!– 2. Put in it two lines: –> <!– Manifest-Version: 1.0 –> <!– Main-Class: com.foo.Main –> <!– 3. Pass to <jar>: manifest="myapp.mf" –> <jar basedir="." compress="true" jarfile="myapp.jar"> <exclude name="**/*.java"/> <exclude name="**/*.form"/> <exclude name="myapp.mf"/> <exclude name="myapp.jar"/> <exclude name="apidoc"/> </jar> </target> <target depends="init,jar" description="Build everything." name="all"> <echo message="Application built. Hello ${hello}!"/> </target> <target depends="init,all" description="Try running it." name="test"> <java classname="com.foo.Main" failonerror="true" fork="true"> <classpath> <pathelement location="."/> </classpath> <!– Pass some args, perhaps: –> <arg value="-myfile"/> <!– Will be given as an absolute path: –> <arg file="myfile.txt"/> </java> </target> <target depends="init" description="Javadoc for my API." name="javadoc"> <mkdir dir="apidoc"/> <javadoc destdir="apidoc" packagenames="com.foo.mylib.*,com.foo.myapi.*"> <sourcepath> <pathelement location="."/> </sourcepath> </javadoc> </target> <target depends="init" description="Clean all build products." name="clean"> <delete> <fileset dir="."> <include name="**/*.class"/> </fileset> </delete> <delete file="myapp.jar"/> <delete dir="apidoc"/> </target> </project> |
Realizar las modificaciones más básicas, necesarias habitualmente, es tan sencillo como quitar algunas de las etiquetas de comentario.
Podemos también, gráficamente haciendo uso del botón derecho sobre cada uno de los targets, seleccionar gráficamente las tareas…
Podemos elegir otras (ver opción marcada) y nos aparecerá un desplegable completo
Si ahora pinchamos sobre una taréa especifica, podemos acceder gráficamente a todos sus modificadores
Con el botón derecho podemos ejecutar el target deseado
Como curiosidad, podéis comprobar que solo se ven los target que disponen de descripción:
<target depends="init" description="Clean all build products." name="clean">
Una cosa muy interesante que podemos hacer es añadir uno de los targest como línea de menú (o botón u otro elemento del entorno)
Añadimos un nuevo elemento al proyecto y seleccionamos un Shortcut
Elegimos un elemento de menú
Seleccionamos el Target
Elegimos el menú
Y ya lo tenemos, un menú nuevo con nuestro comando.
Herramientas hay muchas y además gratuitas. En función de nuestro contexto pueden ser más adecuadas unas que otras.
Si disponemos de poca memoria es probable que herramientas tipo Antelope nos saque de un apuro de un modo rápido. Si no tenemos estas limitaciones, podemos utilizar NetBeans como entorno integrado de desarrollo (u otras herramientas como eclipse)…. que es mucho más potente de lo que parece.
Todo jefe de proyecto debería tratar de liberar a uno de sus recursos del trabajo del día a día (de un modo esporádico) para que aprendiera nuevas técnicas de desarrollo y así aumentar la productividad del equipo completo. Es fácil que si no hacemos esto, nuestra productividad sea injustificadamente baja por la falta de realimentación de conocimientos. La nuevas tecnologías requieren formación continua ……
Roberto Canales Mora
www.adictosaltrabajo.com