La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Taller Software I.  Historia ◦ Creado por James Duncan Davidson (Sun Microsystems) durante el desarrollo de Jakarta Tomcat. ◦ Problema con make en Solaris.

Presentaciones similares


Presentación del tema: "Taller Software I.  Historia ◦ Creado por James Duncan Davidson (Sun Microsystems) durante el desarrollo de Jakarta Tomcat. ◦ Problema con make en Solaris."— Transcripción de la presentación:

1 Taller Software I

2  Historia ◦ Creado por James Duncan Davidson (Sun Microsystems) durante el desarrollo de Jakarta Tomcat. ◦ Problema con make en Solaris. Necesidad de un compilador multiplataforma. ◦ ANT nació como un simple intérprete que cogía un archivo XML para compilar Tomcat sin importar la plataforma. ◦ Actualmente es un estándar en el mundo Java.

3  Características ◦ Ant es una herramienta Open-Source utilizada para la compilación y creación de programas Java. ◦ Analogía: Ant es lo que make es para Linux. ◦ Además, no presenta dependencia del SO en el que trabaja.  Ventajas ◦ Ant esta escrito en XML y Java, por lo que ofrece una solución interoperable al nivel de sistema operativo (debido a Java) y configuraciones descriptivas (debido a XML). ◦ Es fácilmente extensible e integrable con muchas herramientas (p.e: Editores, IDE,…)

4  Estructura ◦ Bin  Contiene los ejecutables utilizados por Ant ◦ Lib  Contiene los diversos archivos JAR's que serán utilizados al realizar compilaciones y creación de archivos en Ant. ◦ Docs  Contiene documentación acerca de la configuración de Ant.

5  Ejecutar ANT ◦ El comando ant ejecuta Ant sobre los parámetros del archivo build.xml ◦ Por defecto, el comando ant utiliza el archivo build.xml encontrado en el directorio de ejecución. ◦ Con el parámetro -buildfile nombre_fichero, podemos utilizar un buildfile distinto al Default ant [-buildfile ] [ ]

6 ◦ Archivo build.xml (Estructura)

7  Archivo build.xml(Parámetros) ◦ Project -> Elemento raíz del fichero XML ◦ Property -> Parámetros (en forma de par nombre- valor) que necesitamos para procesar nuestra aplicación. ◦ Target (Objetivo)-> Conjunto de tareas que queremos aplicar a nuestra aplicación. Se pueden crear dependencias entre ellas. ◦ Task (Tarea) -> Código ejecutable que aplicaremos a nuestra aplicación. Puede contener distintas propiedades.

8  Colgando de la carpeta entorno/proyectos creamos el directorio piloto, y dentro del directorio build.  Dentro de build, creamos el archivo build.xml y lo editamos. Archivo build para la construcción de proyectos web en los cursos de formación del servicio de informática de Uniovi

9  Vamos a probar el proyecto. Abrimos una ventana con setenv.bat, y vamos al directorio build donde se encuentra el descriptor de proyecto ant  Ejecutamos ant Buildfile: build.xml BUILD SUCCESSFUL Total time: 0 seconds  El fichero es un descriptor de ant correcto, pero aún no hace nada.

10  Vamos a crear nuestra primer objetivo ANT.  El objetivo env mostrará –de momento- un mensaje por pantalla dando la bienvenida a nuestro primer proyecto ant. Para probarlo, ejecutamos de nuevo ant desde el directorio build. ¿Qué ocurre?

11  Hemos dado de alta un objetivo en ANT, pero al ejecutar el script no hace nada diferente.  Tenemos que forzar la invocación del objetivo, o bien decirle a ant que éste es el objetivo por defecto.  Para invocarlo: >ant env Buildfile: build.xml env: [echo] Bienvenido a mi primer proyecto ant BUILD SUCCESSFUL Total time: 0 seconds

12  Podemos decirle a ANT que una determinad objetivo es la tarea por defecto del proyecto mediante el atributo “default” de la etiqueta “project”  Para establecer env como objetivo por defecto,  Ahora ejecutando ant se deberá disparar el objetivo env.

13  Las propiedades son variables cuyo ámbito es el build.xml y que permiten definir una sola vez algo que puede ser utilizado varias veces en el proyecto ANT.  Para definir una propiedad:  Para utilizarla, se hace referencia siguiendo la siguiente nomenclatura:

14  Dar de alta las siguientes propiedades en el build.xml  Completar el objetivo env para que la salida por pantalla sea: Buildfile: build.xml env: [echo] Bienvenido a mi primer proyecto ant [echo] Nombre del proyecto: Prototipo Web. Curso Arquitectura [echo] Versión: 1.0 [echo] Año: 2008 [echo] Compañía: Universidad de Oviedo BUILD SUCCESSFUL NamePrototipo Web. Curso Arquitectura Version1.0 Year2008 CompanyUniversidad de Oviedo

15  ANT tiene acceso a las propiedades del sistema del Java, a las que se puede acceder desde el build.xml.  Ejemplos: ◦ java.class.path ◦ java.version ◦ java.home ◦ user.home ◦ path.separator ◦ file.encoding ◦ java.compiler ◦ Etc.

16  Completar el objetivo env para que muestre: ◦ La versión del java ◦ El directorio home de java ◦ El Classpath bajo el cual se va a realizar la compilación ◦ El directorio home del usuario

17  Además de a las propiedades del sistema, podemos acceder a las variables de entorno.  En primer lugar, establecemos una variable como manejador del entorno:  Y luego podemos referenciar las variables del entorno como:

18  Hasta ahora hemos empaquetado nuestra primera aplicación web “a mano” utilizando la herramienta jar y desplegándola a mano.  Esto normalmente no se hace así, sino que se automatiza el proceso con alguna herramienta como ANT.  Vamos a completar la estructura de directorios que tenemos iniciada para organizar los recursos de una aplicación web JEE.

19  Para ello, vamos a necesitar crear los siguientes directorios: ◦ src -> En él meteremos todas las clases java y recursos accesibles desde el classpath en general de nuestra aplicación (servlets, clases java, ficheros de properties, etc.). ◦ web -> Dentro meteremos todos los recursos web que serán accesibles desde fuera de la aplicación (jsps, htmls, etc.). ◦ etc -> Ficheros que deban ser copiados al directorio WEB-INF, como el web.xml y otros. ◦ lib -> Librerías que se requiere distribuir con la aplicación, y que por tanto van al WEB-INF/lib ◦ compile-lib ->Directorio que contendrá aquellas librerías necesarias para la compilación pero que no necesitamos distribuir con el fichero war.

20 ◦ distribution ->directorio donde se generará el paquete war antes del despliegue.  Dado que no conviene trabajar con rutas físicas a lo largo de todo el build.xml, es habitual definir propiedades al comienzo del archivo que hagan referencia a cada uno de los directorios. En consecuencia, definimos una propiedad por cada directorio de trabajo que vayamos a manejar:

21 PropiedadValor src.java.dir../src lib.dir../lib compile.lib.dir../compile-lib devetc.dir../etc web.dir../web dist.dir../dist

22  No podemos confiar en que el usuario haya creado todos los directorios que necesitamos, así que el primer paso será crearlos en caso de que no existan. Con: "/>  Mkdir crea un directorio concreto en caso de que no exista ya. Si el directorio existe, no hace nada.

23  Completamos el build.xml creando el objetivo prepare que: 1. Cree los directorios necesarios en el proyecto en caso de que no exista 2. Dependa del objetivo env 3. Sea el objetivo por defecto. ¿Cómo se establece la dependencia entre objetivos? Se realiza añadiendo el atributo depends=“ ” en la etiqueta target para indicar de cual depende. (Terminado en versión 2.0 del piloto)

24  De los procesos importantes que debemos abordar a la hora de construir el paquete de despliegue war, el primero será la compilación de las clases java de la aplicación.  Lo habitual es crear una copia de los ficheros implicados en un directorio de trabajo, y trabajar sobre esta copia durante la compilación y el empaquetado.  Vamos a hacerlo sobre un directorio temporal que denominaremos bin

25  Podemos copiar conjuntos de ficheros.  Y hacer ficheros jar <jar destfile=“nombreFicherJar.jar" basedir=“directorioconlosclass"/>

26  Debemos completar el objetivo prepare para que: ◦ Cree los directorios  bin (propiedad build.dir)  ${build.dir} /src (propiedad build.src)  ${build.dir} /classes (propiedad build.dest)  ${build.dir} /web (propiedad build.web)  ${build.web} /web-inf (propiedad build.web-inf) ◦ Copie el contenido de la carpeta src a la carpeta referenciada por build.src. Para copiar, ant tiene una tarea predefinida: ” “/>

27  Complementamos el objetivo prepare para que copie los ficheros que se encuentre dentro de la carpeta src a la carpeta bin/src  Creamos un src una clase HolaMundo que simplemente salude, pero que compile –de cara a los próximos ejemplos.  Ejecutamos Ant y vemos qué sucede ¿Lo ha copiado?  Ejecutamos Ant por segunda vez. ¿Ahora?  Modificamos el archivo en cualquier carácter y ejecutamos Ant de nuevo ¿Y ahora?

28  La tarea predefinida copy tal y como la hemos invocado copia todo lo que se encuentre colgando del directorio origen.  Sin embargo, en el directorio origen puede haber archivos que no estén relacionados con la compilación del proyecto, y por lo tanto no deben ir al directorio bin. Ejemplos: ◦ Recursos de svn o CVS ◦ Diagramas de herramientas CASE ◦ Archivos de proyectos de IDEs ◦ Etc.

29  Para evitarlo, se puede filtrar el conjunto de archivos sobre los que ejecutar una tarea.

30  Vamos a parametrizar la invocación de la tarea copy para que incluya cualquier tipo de archivo menos  *.bak  *.classpath  *.project  *.~*  *Test*.*  Antes de probarlo, creamos un archivo HolaMundo.bak en el directorio para comprobar el funcionamiento.

31  Es posible que debamos definir los mismos patrones de filtros para varias acciones.  Ejemplo: Los tipos de archivo que forman los fuentes de una aplicación java son siempre los mismos.  Para evitar repetirlo, podemos definir un patternset, y utilizarlo siempre. "> … … "/>

32  Más ejemplos: … … Sólo las incluye en caso de que la propiedad professional tenga valor Incluiría el archivo apuntado por la propiedad

33  Dar de alta el patrón de filtro all.src.files que incluya: ◦ *.java ◦ *.xml ◦ *.properties ◦ *.jpg ◦ *.gif ◦ *.js ◦ *.jsp ◦ *.html (Resuelto en Versión 3.0 del piloto)

34  Un filtro puede hacer referencia a otros filtros en su declaración.  El conjunto de ficheros fuente definido, por ejemplo, está formado por ficheros.java, ficheros de configuración y recursos web.  Es posible definir varios filtros específicos y utilizarlos como parte de otro que los agrupe. "> … "/> "> …

35  Descomponer el filtro all.src.files en ◦ Ficheros.java ◦ Filtro all.conf.files ◦ Filtro all.web.files  Completar el objetivo prepare para que copie todo lo que encaje con el filtro all.web.files que encuentre en el directo web a bin/web  Para probarlo, creamos un index.html en blanco dentro del directorio web. (Resuelto en Versión 4.0)

36  ANT proporciona la tarea predefinida javac para la compilación de fuentes Java. ◦ Buscar recursivamente en los directorios fuente y destino. ◦ Sólo compila las clases java que:  No tengan su.class equivalente en el directorio destino  Lo tengan pero las fechas de modificación sean anteriores a los de su fichero fuente. ◦ Permite seleccionar entre diferentes compiladores java (classic, modern, jikes, jvc, etc.)

37  Ejemplos: <javac srcdir="" destdir="" executable="path-to-java14-home/bin/javac" fork="true" taskname="javac1.4" />

38  Completar el build.xml con un nuevo objetivo compile que: ◦ Sea el objetivo por defecto ◦ Dependa de prepare ◦ Incluya en el classpath de la compilación los directorios lib y compile lib. El Classpath puede establecerse como atributo de la etiqueta javac o como elemento XML anidado: …  Probar a ejecutarlo dos veces. La segunda no debería compilarse nada, a no ser que modifiquemos el fichero.java.

39  Extensión de la tarea jar que permite comprimir recursos en archivos jar.  Además de comprimir, organiza los recursos respetando la estructura estándar de una aplicación web JEE. (se puede conseguir lo mismo parametrizando adecuadamente la tarea jar) " webxml=“ "> "> "/>

40  Vamos a crear un nuevo objeto war que: ◦ Dependa de compile. ◦ Sea el objetivo por defecto.  Para ello: ◦ Definimos una propiedad war.file.name que contenga el nombre que le queramos dar al war: “piloto.war”. ◦ Creamos un archivo web.xml y lo dejamos en blanco (lo que importa para ant es encontrarlo, no lo procesa). ◦ Invocamos la tarea war especificándole donde están los recursos web, el web.xml, las clases y el directorio /lib.  Ejecutamos la tarea, y comprobamos que todo está correcto descomprimiendo el archivo war que debería estar en la carpeta dist. (Resuelto en piloto 5.0)

41 Con lo que ya hemos manejado…: Implementar una tarea clean que permita forzar la reconstrucción completa de la aplicación. ¿Cómo lo hacemos? ¿De qué tarea depende? ¿Qué tarea dependerá de clean?

42  El siguiente paso en nuestro entorno sería desplegar la aplicación.  Para ello, vamos a partir de la versión 6.0 que contiene una aplicación web ejecutable, y extendemos el build.xml con el objetivo deploy. ¿Qué debemos hacer en el deploy? ¿Cómo se desplegaba una aplicación en Tomcat? ¿Cómo referenciamos el directorio de despliegue de Tomcat? (resuelto en versión 7.0)

43  La tarea predefinida javadoc de ant automatiza la generación de esta documentación sobre nuestro proyecto java.  El directorio que señalemos como fuente será recorrido recursivamente teniendo en cuenta los patrones de inclusión y exclusión que determinemos, aplicando el javadoc sobre todas las clases que pasen los filtros.  Ojo! No tiene en cuenta si la clase cambió o no desde la última generación -> No conviene meterla en la cadena de dependencias

44  Ejemplo: <javadoc destdir=“ " author=“{true|false}" version="{true|false}“ "/> locale="es" windowtitle="API de ${proyecto}" doctitle="${proyecto}" bottom="${copyright}"/>

45  Completamos el build.xml creando un objetivo javadoc que genere la documentación de las clases que se encuentre en el directorio src. Para ello: ◦ Definimos una propierad doc.dir que apunte al directorio piloto/doc. ◦ Completamos los objetivos prepare y clean para que tengan en cuenta este directorio. ◦ Creamos el objetivo javadoc para que genere en el nuevo directorio el javadoc de las clases del proyecto. ◦ Consultamos en la página de ant.apache las posibles variaciones de la tarea. (Resuelto en versión 8.0)

46  Ahora, vamos a: ◦ Crear un repositorio svn en nuestra máquina y subir a él el código del proyecto que tenemos hecho. Ojo, sólo subimos lo interesante. ◦ Recordamos:  Creamos el repositorio con svnadmin create c:\Repositorio  Arrancamos el servidor svnserve –-daemon –-root c:\Repositorio  Importamos el proyecto, ejecutando desde la carpeta padre de trabajo: svn import trabajo svn://localhost/trabajo –m”mens..”

47  Una vez que ya lo tenemos en el repositorio…  Desde la cuenta de petra, hacemos el checkout  svn co http://XXX.XXX.XXX.XXX/trabajohttp://XXX.XXX.XXX.XXX/trabajo  Modificamos la tarea despliegueIntegracion para que (separando instrucciones por “;”): ◦ Ejecute en remoto svn update desde el directorio de trabajo ◦ Ejecute en remoto ant desde el directorio build del proyecto.

48 <sshexec host="petra.euitio.uniovi.es" username="temporal" password="muytemporal" trust="yes" command="cd trabajo;svn update;cd build;ant"/>

49  Además de utilizar las tareas predefinidas o extendidas de ant, es posible desarrollar nuestras propias tareas a medida.  Ej: Repositorios de código específicos, interacción con sistemas legacy, etc.  Vamos a crear nuestra primera tarea ANT, y la vamos a utilizar en nuestro proyecto.

50  En primer lugar, arrancamos eclipse (con eclipse.bat), y creamos un proyecto java MiPrimeraTareaAnt en la carpeta proyectos  Añadimos el ant.jar al Java Build Path del proyecto.  Creamos una clase es.uniovi.Log que extienda la clase org.apache.tools.ant.Task  Vamos a sobrescribir el método execute (¿patrón de diseño?), así que le pedimos a eclipse que nos genere el esqueleto del método sobrescribiendo el de la clase Task.

51  El cometido de la tarea será escribir a un fichero qué usuario está realizando la compilación en un momento dado. Para ello, será necesario que la tarea reciba como parámetro el nombre del usuario, así que creamos un atributo privado user de tipo String, y generamos su método setter (inyección de dependencias).  Una vez implementada la clase que dará cuerpo a la nueva tarea, debemos empaquetarla en un nuevo jar, log.jar

52  Para ello, creamos log.jar en la carpeta build seleccionando la clase Log desde Eclipse y mediante File/Export…  Y ya podemos declarar un objetivo que utilice la tarea log. Para probarlo, ◦ Debemos decirle a ANT donde qué clase contiene la implementación de la tarea log. ◦ Modificamos el build.xml para que lo primero que haga la tarea ENV sea escribir al log con el usuario que esté logueado en el sistema. E invocamos ant, forzándole a que tenga en cuenta el log.jar en el classpath: >ant log -lib log.jar (Resuelto en versión 9.0)

53  Tarea sshexec (tarea opcional) ◦ Me permite ejecutar órdenes de comando en máquinas remotas. ◦ Ej: <sshexec host=“nombredelhost” username=“miusuario" password=“mipassword" trust=“yes" command="mkdir nuevoDirectorio"/>  http://www.jcraft.com/jsch/index.html, bajar el jar y copiarlo al lib de ant. http://www.jcraft.com/jsch/index.html

54  Crear un nuevo objetivo preparePetra que cree una carpeta en vuestra cuenta de petra y que dependa de la tarea war. Si no tenéis, usuario temporal/muytemporal. ◦ La llamamos despliegueIntegracion  Crear una tarea deployPetra que dependa de la anterior y envíe por ftp el archivo war a la carpeta despliegueIntegración creada en petra. Hay que buscar en la referencia de ANT como hacer un secure FTP. Nota: El home de temporal es /home/temporal (Solución en versión 10.0)

55  Ant tiene una tarea específica para disparar pruebas unitarias:  Ejemplo de uso: "/> “includes="**/Test*.class" />

56  Descargar piloto 10.0 (imprescindible, contiene el junit.jar)  Extender el build.xml de modo que: ◦ Creamos el objetivo test ¿De quién dependerá? ◦ Invocamos a la tarea junit para ejecutar todos los tests que tengamos en el proyecto. ◦ Creamos la clase TestHolaMundo con un método testSaludo() que directamente dispare un aserto assertTrue( "TestExample", true ); y muestre un mensaje por pantalla. ◦ Probamos el objetivo. (Resuelto en piloto 11.0)

57  Arrancamos el eclipse desde el setenv –para que tenga las variables de entorno ANT_HOME y CATALINA_HOME  Creamos un proyecto Java en el directorio del proyecto.  Creamos una configuración de despliegue de ANT para el proyecto  Probamos

58  Bajamos el plugin de tomcat de la página del curso.  Descomprimimos el contenido, y lo copiamos a la carpeta plugins.  Reiniciamos el Eclipse  Configuramos el plugin de Tomcat en Window/Preferences  Probamos a desplegar de nuevo con el tomcar embebido en eclipse.

59  A partir del piloto 11.0, modificar build.xml para: ◦ Crear un objetivo jar que empaquete todos los fuentes java en un archivo piloto.jar. ◦ Modificar lo que sea necesario para que los fuentes dentro del war queden empaquetadas dentro del jar en el directorio lib en lugar de estar en el directorio classes. Resuelto en piloto 12.0

60  Modificar la última versión del piloto para que se adecúe a la siguiente estructura de directorios Ejemplo: MiAplicacióncompile-libdistdocbinwebbuild.xmlsrcmainjavacom..webappimagesWEB-INF web.xml /MiAplicación /compile-lib /dist /doc /bin /web /build.xml /src /main /java /com.. /webapp /index.jsp /hola.html /images/yo.gif /WEB-INF /web.xml /lib


Descargar ppt "Taller Software I.  Historia ◦ Creado por James Duncan Davidson (Sun Microsystems) durante el desarrollo de Jakarta Tomcat. ◦ Problema con make en Solaris."

Presentaciones similares


Anuncios Google