You are on page 1of 13

Link para o tutorial: http://www.arquivodecodigos.net/arquivo/tutoriais/ant/automacao.

php Automao de Builds Usando o Apache Ant Este tutorial apresenta o Apache Ant e algumas das principais tarefas que podem ser automatizadas com o uso desta ferramenta. Com o Ant podemos realizar tarefas corriqueiras que vo desde a criao e excluso de diretrios at o empacotamento de arquivos JAR e WAR. Se voc desenvolver Java, mas ainda no conhece esta ferramenta, a leitura e releitura deste tutorial traro muitos benefcios e reduo de tempo no desenvolvimento de seus projetos. O que o Apache Ant? O Apache Ant, ou simplesmente Ant, uma ferramenta escrita em Java e usada para a automatizao de builds e tarefas. Para desenvolvedores veteranos, o Ant uma espcie de make, porm, mais simples de se configurar e usar. O uso do Ant justificado devido quantidade de tarefas que devem ser executadas antes que uma aplicao esteja pronta para instalao ou distribuio final. Entre estas tarefas esto a compilao de classes Java, a criao ou excluso de diretrios, empacotamento de arquivos, execuo de programas externos, etc. Quando se est usando um IDE, este se encarrega de realizar estas tarefas, uma vez que muitos deles j trazem o Ant embutido. No entanto, o entendimento do Ant, e suas principais tarefas, muito importante para o desenvolvedor Java que deseja entender como estas operaes funcionam nos bastidores. O processo de automao de tarefas usando o Ant est completamente centrado no uso de um documento XML que contm toda a informao sobre as tarefas a serem executadas. Como estes documentos XML so criados e configurados pelo desenvolvedor, recomendo que voc reveja seus conhecimentos sobre esta linguagem de marcao antes de progredirmos. No momento que voc estiver lendo este tutorial provavelmente teremos algo sobre XML neste site. Caso voc sinta que precisa aprimorar seus conhecimentos nesta linguagem no deixe de visitar a pgina inicial do site e pesquisar alguma coisa sobre XML. Baixando e Instalando o Apache Ant Os passos descritos neste tpico guiaro voc durante o processo de baixar, instalar e configurar a ferramenta Ant no Windows XP. De acordo com a documentao no endereohttp://ant.apache.org/, esta ferramenta pode ser usada com sucesso em outras plataformas tais como Linux, Solaris, MacOS X, entre outros. Voc no ter dificuldades em adaptar as instrues contidas aqui caso deseje usar o Ant em outros sistemas. Este tutorial foi escrito usando-se a verso 1.6.3 do Ant (liberada em Abril de 2005). Para baix-la basta direcionar seu navegador para o endereohttp://ant.apache.org/bindownload.cgi e localizar o link apache-ant-1.6.3-bin.zip. Clique neste link, baixe o arquivo para seu computador e siga os passos descritos a seguir para instalar, configurar e testar o Ant: 1) Descompacte o arquivo que voc baixou em qualquer diretrio. O resultado ser uma pasta com o nome apache-ant-1.6.3-bin contendo outra pasta chamada apache-ant-1.6.3. Altere o nome da segunda pasta para ant e mova-a para o diretrio raiz de seu sistema. No final do processo voc dever ter a seguinte estrutura de diretrios e arquivos:

2)

A nica exigncia para que o Ant funcione corretamente que voc possua uma instalao recente do SDK J2SE. Se voc possui o Tomcat ou o servidor de aplicaes do J2EE instalado e rodando na sua mquina, no precisa se preocupar. O seu SDK J2SE j est instalado e funcionando. Dessa forma, s precisamos adicionar o diretrio bin do Ant ao path do sistema. No Windows XP isso feito da seguinte forma: a) V at Iniciar -> Configuraes -> Painel de Controle -> Sistema; b) Na aba "Avanado" clique em "Variveis de Ambiente"; c) Em "Variveis de usurio para" voc tem as opes de incluir, alterar ou remover as variveis e/ou seus valores. Se a varivel PATH ainda no estiver definida, defina-a. Em seguida adicione o valor "C:\ant\bin". Isso far com que o Windows (ou qualquer sistema que voc esteja executando) reconhea o comando ant a partir de qualquer diretrio. Se a varivel PATH contiver mais de um valor, certifique-se de que esteja em um formato

similar C:\Sun\AppServer\bin;C:\Sun\AppServer\jdk\bin;C:\ant\bin 3)

a:

E agora, hora de testar o Ant. Se voc seguiu todos os passos descritos para a instalao e configurao, abra uma janela do DOS (ou o prompt do Linux) e digite o seguinte comando: ant version Se a ferramenta estiver funcionando corretamente voc ver o seguinte resultado: Apache Ant version 1.6.3 compiled on April 28 2005 Se voc detectou algum problema volte e certifique-se de que seguiu as instrues contidas aqui e tambm as dicas fornecidas no manual do Ant. Em seguida estudaremos o componente principal do Apache Ant, o arquivo build.xml.

Entendendo alvos, tarefas e o arquivo build.xml A automatizao de tarefas com o Ant feita usando-se arquivos de configurao escritos em XML. Estes arquivos, geralmente chamados de build.xml possuem uma estrutura uniforme, variando apenas alguns elementos. Em geral, seguem o seguinte modelo: <project name="nome_projeto" basedir="." default="alvo1"> <target name="alvo1"> <tarefa1 /> <tarefa2 /> </target> <target name="alvo2"> <tarefa1 /> <tarefa2 /> </target> <target name="alvo3"> <tarefa1 /> </target> </project> A raiz deste documento XML o elemento project. Os elementos-filhos so chamados de target (alvo) que, por sua vez, possuem tasks (tarefas) como seus elementos-filhos. Veja a definio dos trs atributos para o elemento project: name: O nome do projeto. Este atributo pode ser omitido; basedir: O diretrio base a partir do qual os demais caminhos para arquivos e diretrios sero calculados. O valor "." define o diretrio atual. Este atributo pode ser omitido; default: O alvo (target) padro a ser usado quando nenhum alvo especificado na linha de comando. Um elemento project pode conter um nmero ilimitado de targets. Os elementos targets possuem elementos-filhos que nos permitem definir as tarefas a serem realizadas quando um determinado alvo executado. Entre os atributos de um elemento target o mais importante name. Este atributo no pode ser omitido. Tarefas (tasks) so trechos de cdigo que podem ser executados dependendo do objetivo da aplicao e de qual alvo o Ant est executando no momento. Dentre as tarefas mais comuns esto: criar, renomear ou excluir diretrios, compilar e empacotar arquivos, etc. O tpico seguinte mostra um exemplo simples de um arquivo XML que cria um diretrio e copia um arquivo de outro diretrio para o recm-criado. Aproveite este exemplo para entender melhor o funcionamento da ferramenta. Criando diretrios e copiando arquivos usando Ant No tpico anterior voc aprendeu os principais elementos de um arquivo XML para a automao de tarefas usando o Ant. Este tpico mostra um exemplo do uso desta ferramenta para criar diretrios e copiar arquivos. Para isso voc dever efetuar os seguintes passos: a) Crie um diretrio chamado "antTeste". Lembre-se. Limite seus nomes de diretrios a oito caracteres no DOS; b) Dentro deste diretrio crie um arquivo em branco chamado "index.jsp"; c) Abra o bloco de notas (ou seu editor favorito) e crie o seguinte documento XML: <project name="teste" basedir="." default="alvo"> <target name="alvo"> <mkdir dir="paginas" /> <copy file="index.jsp" todir="paginas" />

</target> </project> Salve este arquivo com o nome de build.xml no diretrio antTeste. Se este diretrio foi criado na raiz do seu sistema, voc poder abrir uma seo do DOS, navegar at o diretrio antTeste e executar o seguinte comando: C:\ANTTESTE>ant alvo Se a estrutura do documento XML estiver bem formada, voc ver o seguinte resultado: Buildfile: build.xml alvo: [mkdir] Created dir: C:\ANTTESTE\paginas [copy] Copying 1 file to C:\ANTTESTE\paginas BUILD SUCCESSFUL Total time: 0 seconds Abra o diretrio antTeste e ver que a pasta paginas foi criada e dentro desta temos uma cpia do arquivo index.jsp. Vamos entender como isso aconteceu: O elemento raiz do documento XML: <project name="teste" basedir="." default="alvo"> </project> Define o diretrio atual como valor para a propriedade basedir e define o target alvo como padro. Desta maneira, o mesmo resultado poderia ser obtido omitindo o valor alvo na chamada ao Ant: C:\ANTTESTE>ant Observe agora a estrutura do elemento target cujo nome alvo: <target name="alvo"> <mkdir dir="paginas" /> <copy file="index.jsp" todir="paginas" /> </target> Veja que a primeira tarefa deste alvo criar o diretrio "paginas": <mkdir dir="paginas" /> A segunda tarefa copia o arquivo index.jsp para o diretrio paginas: <copy file="index.jsp" todir="paginas" /> Como voc pode ver, o atributo basedir foi definido, mas no o usamos durante a execuo das tarefas (embora a ferramenta o tenha usado implicitamente para saber o diretrio a partir do qual as tarefas propostas deveriam ser realizadas). Veremos como faz-lo no prximo tpico. Usando variveis durante o processo de automao de tarefas O Apache Ant nos permite usar variveis nos documentos XML usados na automao das tarefas. Este um recurso interessante, pois torna o processo mais dinmico e encoraja o reaproveitamento de cdigo. Alm disso, a ferramenta traz algumas variveis embutidas e permite o acesso a propriedades do sistema, como veremos mais adiante. Em geral o acesso a variveis feito na forma ${nome_da_varivel}. Veja um exemplo de tarefa que cria uma pasta chamada paginas no diretrio home do usurio atual: <target name="diretorio"> <mkdir dir="${user.home}/paginas" /> </target> Outra forma de se usar variveis declar-las globais usando a tarefa property. Isso feito antes da declarao de qualquer elemento target. Veja um exemplo: <project name="teste" basedir="c:/estudos" default="dir">

<property name="src" location="src"/> <property name="build" location="build"/> <target name="dir"> <mkdir dir="${src}/java" /> <mkdir dir="${build}/dist" /> </target> </project> Uma tarefa property possui muitos atributos. Para este exemplo estamos usando namee location. Veja suas definies: name: O valor da propriedade, ou seja, aquele que ser referenciado como varivel dentro das tarefas do documento XML. location: Associa a propriedade a um nome de arquivo ou diretrio. Neste caso o caminho pode ser absoluto ou relativo. Sendo relativo, o caminho ser expandido de acordo com o valor da propriedade basedir. O valor da propriedade basedir "c:\estudos". Se chamarmos o Ant neste exemplo teremos o seguinte resultado: Buildfile: build.xml dir: [mkdir] Created dir: C:\estudos\src\java [mkdir] Created dir: C:\estudos\build\dist BUILD SUCCESSFUL Total time: 0 seconds Experimente alterar os valores dos atributos name e location e observe o resultado obtido. Altere agora o valor da propriedade basedir e efetue mais alguns testes. Em seguida veremos como compilar um arquivo .java e mover o resultado da compilao, ou seja, o arquivo .class resultante, para um diretrio previamente especificado. Como compilar arquivos Java usando Ant Nosso prximo exemplo um pouco mais elaborado e coloca em prtica alguns dos conceitos explicados nos tpicos anteriores. Desta vez voc usar o Ant para compilar um arquivo .java, criar um diretrio e mover para este diretrio o resultado da compilao, ou seja, o arquivo com a extenso .class. Para isso siga os seguintes passos: 1) Crie um diretrio no qual o projeto ser desenvolvido, pode ser algo como "c:\testes" (ou algo semelhante se estiver usando Linux); Abra seu editor favorito e escreva o seguinte programa Java: public class TesteAnt{ public static void main(String args[]){ System.out.println("Compilando com Ant"); } } Salve este arquivo com o nome de TesteAnt.java no diretrio que voc criou no passo 1.

2)

3)

Crie um documento XML semelhante ao mostrado a seguir: <project name="teste" basedir="." default="compilar"> <property name="classes" location="classes"/> <target name="dir"> <mkdir dir="classes" /> </target> <target name="compilar" depends="dir"> <javac srcdir="${basedir}" destdir="${classes}" /> </target> </project> Salve este arquivo com o nome build.xml no diretrio que voc criou no passo 1.

4)

Hora do teste. Abra uma seo do DOS, navegue at o diretrio que voc criou e execute o comando: C:\TESTES>ant compilar

Se voc seguiu os passos anteriores atentamente, voc ver o seguinte resultado:

Buildfile: build.xml dir: [mkdir] Created dir: C:\TESTES\classes compilar: [javac] Compiling 1 source file to C:\TESTES\classes BUILD SUCCESSFUL Total time: 2 seconds Abra o diretrio "c:\testes" e ver a pasta classes. Dentro desta pasta voc encontrar arquivo TesteAnt.class. Realmente uma ferramenta muito til, no? Vamos ver como isso aconteceu. Observao Importante: Se houver mais de um arquivo .java neste diretrio todos eles sero compilados e os arquivos .class correspondentes sero copiados para a pasta classes. Existe, porm, uma ressalva nesta regra: somente arquivos .java que no possuem seus arquivos .class correspondentes ou arquivos .java mais recentes que seus arquivos .class que sero compilados. Mais adiantes veremos o uso de filtros para compilar apenas determinados arquivos. Este exemplo pode ser executado chamando o Ant sem argumentos. Lembra-se de que, na falta de argumentos, a tarefa que ser executada aquela definida no atributo default? Analise a seguinte tarefa: <target name="compilar" depends="dir"> Veja que ao usarmos o atributo depends, estamos informando ao Ant que a tarefa compilar dever ser executada somente aps a execuo da tarefa dir. E, nem precisamos chamar esta tarefa a partir da linha de comando. O Ant se encarrega de tudo. Aps a criao do diretrio classes na tarefa dir: <target name="dir"> <mkdir dir="classes" /> </target> temos a tarefa que compila o arquivo .java e copia o resultado (o arquivo .class) para o diretrio classes: <target name="compilar" depends="dir"> <javac srcdir="${basedir}" destdir="${classes}" /> </target> Veja que para este exemplo fornecemos ao compilador Java apenas o diretrio de sada (srcdir) e o diretrio de destino (destdir). possvel fornecer mais informaes tais como classpath, target, etc. Vamos ver agora como possvel executar o arquivo .class usando Ant? Uso do Ant na execuo de aplicativos Java No tpico anterior escrevemos um arquivo de build que permitia compilar arquivos .javae copi-los para um determinado diretrio. Para demonstrar como possvel at mesmo executar o arquivo resultante da compilao (arquivos .class) vamos modificar o documento XML usado no exemplo anterior para esta nova verso: <project name="teste" basedir="." default="compilar"> <property name="classes" location="classes"/> <property name="arquivo" value="TesteAnt" /> <target name="dir"> <mkdir dir="classes" /> </target> <target name="compilar" depends="dir"> <javac srcdir="${basedir}" destdir="${classes}" /> </target> <target name="executar" depends="dir, compilar"> <java classname="${arquivo}" > <classpath path="${classes}" /> o

</java> </target> </project> Este arquivo XML contm informaes para algumas tarefas um pouco mais complexas. Comece analisando a segunda tarefa property: <property name="arquivo" value="TesteAnt" /> Veja que est tarefa se chama arquivo e possui o valor TesteAnt. Fique atento ao uso deste valor mais adiante. O diretrio classes criado com o seguinte alvo: <target name="dir"> <mkdir dir="classes" /> </target> Para compilar o arquivo TesteAnt.java e copi-lo para a pasta classes usamos o alvo: <target name="compilar" depends="dir"> <javac srcdir="${basedir}" destdir="${classes}" /> </target> Finalmente, executamos o arquivo resultante (TesteAnt.class) usando o alvo: <target name="executar" depends="dir, compilar"> <java classname="${arquivo}" > <classpath path="${classes}" /> </java> </target> Veja que esta tarefa depende das duas tarefas anteriores. Desta forma, voc poder executar o Ant fornecendo o alvo executar como argumento: Ant executar Dentre os argumentos que podem ser fornecidos para a tarefa java, os mais importantes so classname (o nome da classe a ser executada) e classpath (o caminho para o diretrio que contem a(s) classe(s)). Observe que temos que usar o atributo pathjuntamente com o argumento classpath. Como sugesto, recomendo que voc investigue na documentao do Ant outros argumentos possveis. Exibindo mensagens durante o processo de automao das tarefas Durante o processo de execuo das diversas tarefas definidas no documento XML, possvel exibir mensagens usando a tarefa echo. Este procedimento til quando precisamos de um feedback visual dos procedimentos realizados pelo Ant. O documento XML a seguir mostra a voc como se certificar de que os valores fornecidos para algumas variveis so realmente aqueles que voc precisa durante a realizao das tarefas. O exemplo mostra ainda como exibir valores das variveis embutidas no Ant: <project name="teste" basedir="." default="exibir"> <tstamp> <format property="horas" pattern="hh:mm:ss" locale="br"/> <format property="data" pattern="dd/MM/yyyy" locale="br"/> </tstamp> <property name="projeto.nome" value="TesteEcho"/> <target name="exibir"> <echo>Este e um exemplo de como voce pode usar a tarefa echo para exibir mensagens durante o processo de automacao de builds.</echo> </target> <target name="java"> <echo message="Instalacao do Java: ${java.home}"/> </target> <target name="projeto"> <echo message="Projeto: ${projeto.nome}"/> </target> <target name="DataHora">

<echo message="Data e Hora: ${data} - ${horas}" /> </target> </project> Este documento XML apresenta a tarefa Tstamp. Esta tarefa muito til quando queremos exibir informaes sobre a hora e a data em que o arquivo que a contm foi processado pelo Ant. Seu propsito definir as propriedades DSTAMP, TSTAMP e TODAY. Por padro, a propriedade DSTAMP definida no formato "yyyyMMdd", TSTAMP definida no formato "hhmm" e TODAY no formato "MMMM dd yyyy". Uma abordagem interessante usar o elemento format para formatar estes dados de acordo com o formato a que estamos acostumados. Veja como o usamos no exemplo: <tstamp> <format property="horas" pattern="hh:mm:ss" locale="br"/> <format property="data" pattern="dd/MM/yyyy" locale="br"/> </tstamp> Aqui temos um elemento format com trs atributos. O primeiro atributo define a varivel global que poder ser acessada nas tarefas do documento. O segundo atributo o padro de data a ser aplicado e o ultimo atributo fornece a identificao do pas que possui o padro de data usado. O atributo locale pode ser omitido sem prejudicar a estrutura do documento. Por enquanto, saiba que as variveis horas e data podero ser acessadas em todo o documento XML usando-se os formatos ${data} e ${horas}. Aps a definio da tarefa Tstamp, temos uma tarefa property: <property name="projeto.nome" value="TesteEcho"/> Usamos esta tarefa para fornecer um nome para o projeto. Veja que possvel usar pontos (.) nos nomes das tarefas property. Isso facilita a criao de hierarquias. A partir deste ponto o nome do projeto pode ser acessado usando-se ${projeto.nome}. O primeiro alvo, que pode ser invocado por "ant exibir", executa apenas a tarefa echo. Como resultado, teremos apenas a exibio, no console, do texto entre as tags <echo></echo>: <target name="exibir"> <echo>Este e um exemplo de como voce pode usar a tarefa echo para exibir mensagens durante o processo de automacao de builds. </echo> </target> O segundo alvo, que pode ser invocado por "ant java", executa outra tarefa echo. Desta vez temos a exibio do local de instalao do Java: <target name="java"> <echo message="Instalacao do Java: ${java.home}"/> </target> Os dois ltimos alvos, invocados por "ant projeto" e "ant DataHora", fazem uso da tarefaecho para exibir o nome do projeto e a data e hora da execuo das tarefas. Empacotando aplicaes web com o uso da tarefa War Finalmente chegamos ao objetivo principal do nosso estudo sobre a ferramenta Ant: a criao de arquivos War (Web Archive). Para este propsito usaremos a tarefa War, que fornece uma forma bem dinmica de montar a estrutura de diretrios exigida por aplicaes web. Clique aqui caso voc ainda no conhea a forma bsica de organizao de arquivos em uma aplicao web desenvolvida em Java. Quando usamos a tarefa War para empacotar os arquivos de uma aplicao web, o prprio Ant se encarrega de distribuir os diversos arquivos nos diretrios WEB-INF, WEB-INF/lib e WEB-INF/classes. Para ver como isso funciona voc dever seguir atentamente as instrues seguintes: 1) 2) Crie um diretrio chamado "c:\TesteWar" (ou algo parecido). Desde que seja um nome de arquivo curto e fcil de ser lembrado; Abra seu editor de texto e crie dois documentos JSP e um documento HTML. Estes documentos podem estar sem nenhum contedo. Salve-os com os nomes de "index.jsp", "login.jsp" e "index.html" no diretrio que voc criou no passo 1, ou seja, "c:\TesteWar".

3) 4) 5)

Crie um documento XML chamado web.xml (pode ser completamente em branco). Salve-o no diretrio criado no passo 1. Crie pastas chamadas libs e java dentro do diretrio "c:\TesteWar". Encontre em seu sistema alguns arquivos .jar e copie-os para a pasta libs. Agora copie alguns arquivos.class para a pasta java. Se voc seguiu os passos anteriores atentamente j podemos escrever o documento XML que nos possibilitar criar a estrutura da aplicao web e empacot-la em um arquivo War. Para isso crie o arquivo XML a seguir: <project name="teste" basedir="." default="build"> <property name="dist.dir" location="dist"/> <target name="build"> <mkdir dir="${dist.dir}" /> <war destfile="${dist.dir}/TesteWar.war" webxml="web.xml"> <fileset dir="${basedir}"> <include name="**/*.jsp"/> <include name="**/*.html"/> </fileset> <lib dir="libs" /> <classes dir="java"/> </war> </target> </project> Salve este arquivo como build.xml no diretrio "c:\TesteWar". Antes de efetuarmos o teste definitivo responda as questes seguintes: a) Voc tem um diretrio chamado "c:\TesteWar" arquivos index.jsp,login.jsp, index.html, build.xml e web.xml e as pastas libs e java? b) A pasta libs contm um ou mais arquivos .jar? c) A pasta java contm um ou mais arquivos .class? contendo os

Se voc respondeu "sim" s trs perguntas, abra uma seo do DOS e navegue at o diretrio "c:\TesteWar". Em seguida execute o comando: ant build Se estiver tudo correto, voc ter o seguinte resultado: Buildfile: build.xml build: [mkdir] Created dir: C:\TESTEWAR\dist [war] Building war: C:\TESTEWAR\dist\TesteWar.war BUILD SUCCESSFUL Total time: 2 seconds Observe que o resultado final, ou seja, o arquivo .war foi gerado e colocado na pasta dist no diretrio atual. No prximo tpico voc aprender como usar a tarefa Unwarpara extrair o contedo de um arquivo War. Enquanto isso, renomeie o arquivoTesteWar.war para TesteWar.zip e descompacte-o. Observe sua estrutura. No semelhante estrutura das aplicaes web desenvolvidas nas tecnologias relacionadas ao Java (JSP, Struts, JSF, Servlets, etc)? Este documento XML bem parecido queles que voc ter que escrever quando estiver desenvolvendo aplicaes web usando JSP, Struts, JSF, Servlets, etc. Por esta razo, vamos analis-lo cuidadosamente. Comece analisando o elemento principal, ou seja, a tag <project>: <project name="teste" basedir="." default="build"> O nome do projeto teste, o diretrio base aquele em que o arquivo build.xml reside e o alvo padro build. Lembre-se de que o alvo padro aquele executado quando o Ant invocado sem nenhum argumento. Em seguida temos uma tarefa property: <property name="dist.dir" location="dist"/> Esta tarefa poder ser referenciada nas demais tarefas usando-se a forma ${dist.dir} e representa o diretrio onde o arquivo War ser gerado. Veja agora a estrutura do alvo build: <target name="build"> <mkdir dir="${dist.dir}" /> <war destfile="${dist.dir}/TesteWar.war" webxml="web.xml"> <fileset dir="${basedir}"> <include name="**/*.jsp"/> <include name="**/*.html"/>

</fileset> <lib dir="libs" /> <classes dir="java"/> </war> </target> A primeira tarefa deste alvo cria o diretrio dist: <mkdir dir="${dist.dir}" /> Veja como este diretrio fornecido ao atributo destfile da tarefa war: <war destfile="${dist.dir}/TesteWar.war" webxml="web.xml"> Os dois atributos mais importantes da tarefa war so destfile e webxml. Veja suas definies: destfile: o nome do arquivo war a ser criado. No esquea de adicionar a extenso .war. webxml: o caminho relativo e o nome do arquivo descritor de instalao. Este arquivo, geralmente chamado de web.xml fornece ao container ou servidor de aplicaes, informaes sobre os componentes usados, as variveis de ambiente e os requisitos de segurana. A prpria tarefa war se encarrega de copiar este arquivo para o diretrio WEB-INF. Para definir os arquivos que sero copiados para o diretrio raiz da aplicao web usamos o elemento fileset. Este elemento permite copiar os arquivos e pastas contidas no diretrio fornecido para o atributo dir. Para o nosso exemplo queremos apenas os documentos com as extenses .jsp e .html. Para isso usamos o elemento include com a extenso dos arquivos a serem includos: <fileset dir="${basedir}"> <include name="**/*.jsp"/> <include name="**/*.html"/> </fileset> O elemento fileset fornece muita funcionalidade que, um tpico inteiro deveria ser dedicado a ele. Recomendo que estude a seo da documentao Ant que trata dos elementos fileset, dirset e filelist. Mas no se preocupe. Sempre que estes elementos forem usados nos exemplos, uma explicao sobre sua funcionalidade ser fornecida. O prximo passo definir o diretrio que contem os arquivos a serem copiados para o diretrio lib da aplicao web. Isso feito por meio do elemento lib: <lib dir="libs" /> Aqui, todos os arquivos e pastas contidas no diretrio libs sero copiados para o diretriolib da aplicao. Procedimento semelhante adotado para copiar os arquivos do diretriojava para o diretrio classes da aplicao web. Desta vez usamos o elemento classes: <classes dir="java"/> Para finalizar s precisamos fechar a tarefa war: </war> Pareceu complicado? Os primeiros documentos XML para a gerao de arquivos war so, de fato, complicados. Mas, medida que voc se acostumar a eles ver com que facilidade eles podem ser escritos e reaproveitados. Recomendo que efetue algumas alteraes neste documento e veja os resultados obtidos. Em seguida veremos como usar a tarefa Unwar para extrair o contedo de um arquivo war.

Importante: Quando a estrutura de desenvolvimento da aplicao web for semelhante quela do pacote WAR, voc poder usar uma ferramenta de compactao zip. As ferramentas mais modernas destinadas a esta tarefa possibilitam a voc selecionar um grupo de diretrios e/ou arquivos, clicar com o boto direito em qualquer parte da seleo e escolher o nome do arquivo zip que representar o resultado final. Mais tarde voc s precisar renomear este resultado para .war e sua aplicao estar pronta para ser distribuda.

Usando a tarefa Unwar para extrair o contedo de um arquivo War No tpico anterior voc aprendeu a usar a tarefa War para empacotar aplicaes web. Porm, at o momento, a nica maneira que tnhamos para extrair o contedo de um arquivo .war era renome-lo para um arquivo .zip e descompactalo.

A tarefa Unwar fornece um maneira muito simples de extrair o contedo de um arquivo .war. Vamos ver como podemos us-la. Abra o documento XML que escrevemos no tpico anterior e acrescente a seguinte tarefa: <target name="extrair"> <unwar src="${dist.dir}/TesteWar.war" dest="c:\estudos\TesteWar"/> </target> A tarefa Unwar exige valores para dois de seus atributos. O atributo src dever receber o caminho e nome do arquivo .war a ser descompactado. O atributo dest, por sua vez, receber o caminho e nome do arquivo de destino (que ser, na verdade, uma pasta de destino). Hora do teste. Se voc executou a tarefa build para gerar o arquivo War, experimente executar a tarefa extrair. Veja como todo o contedo do pacote TesteWar.war descompactado e depositado na pasta TesteWar, localizada em "C:\estudos\TesteWar". Tenha a certeza de criar a pasta "C:\estudos" antes de efetuar o teste. Como gerar arquivos JAR usando Ant Agora que voc j conhece algumas das tarefas bsicas da ferramenta Ant, podemos avanar um pouco mais. Neste tpico voc aprender como escrever um aplicativo Java composto de trs classes. Em seguida escrever um arquivo de build que compilar estas classes. Finalmente voc as colocar em um arquivo Jar para distribuio. Lembre-se de que todo o processo de compilao das classes e gerao do arquivo Jar dever ser feito por um nico arquivo de build. O primeiro passo ser escrever os arquivos .java que faro parte do exemplo. Este um aplicativo simples composto de trs classes chamadas Empresa, Funcionario e Cliente(boa hora para praticar composio). Para acompanhar este exemplo voc dever criar um diretrio chamado testes em seu sistema (no meu sistema estou usando "C:\testes"). Em seguida crie trs arquivos .javade acordo com as listagens seguintes (para sua comodidade estes arquivos esto disponveis para download. Basta clicar no nome de cada um deles): Listagem para a classe Funcionario.java: class Funcionario{ private String nome; private double salario; public Funcionario(String nome, double salario){ this.nome = nome; this.salario = salario; } public String getNome(){ return nome; } public double getSalario(){ return salario; } } Listagem para a classe Cliente.java: class Cliente{ private String nome; private int codigo; public Cliente(String nome, int codigo){ this.nome = nome; this.codigo = codigo; } public String getNome(){ return nome; } public int getCodigo(){ return codigo; } } Listagem para Empresa.java: public class Empresa{ public static void main(String args[]){ Funcionario func = new Funcionario("Carlos", 3465.23); Cliente cli = new Cliente("Bush", 324);

System.out.println("Funcionrio: " + func.getNome()); System.out.println("Cliente: " + cli.getCodigo()); System.exit(0); } } Este exemplo muito simples. Tudo que temos aqui uma classe pblica (Empresa) que constri instancias de duas classes que possuem acesso de pacote. No entraremos em detalhes sobre o funcionamento de cada uma. Nosso objetivo entender como o Ant nos possibilita compilar e empacotar estas classes em um arquivo Jar. Sendo assim vamos escrever o arquivo build.xml. Eis a listagem: <project name="teste" basedir="." default="executar"> <property name="classes" location="classes"/> <target name="dir"> <mkdir dir="classes" /> </target> <target name="limpar"> <delete dir="classes"/> </target> <target name="compilar" depends="dir"> <javac srcdir="${basedir}" classpath="${classes}" destdir="${classes}" /> </target> <target name="empacotar" depends="compilar"> <mkdir dir="build/jar"/> <jar destfile="build/jar/Empresa.jar" basedir="${basedir}/classes"> <manifest> <attribute name="Main-Class" value="Empresa"/> </manifest> </jar> </target> <target name="executar" depends="empacotar, limpar"> <java jar="build/jar/Empresa.jar" fork="true"/> </target> </project> Antes de executarmos este exemplo certifique-se de ter efetuado todos os passos descritos anteriormente, ou seja, voc dever ter um diretrio chamado C:\testes contendo trs arquivos .java e o arquivo de build (build.xml). Agora s abrir uma seo do DOS, navegar at C:\testes e inserir o comando abaixo: C:\testes>ant Veja o resultado da execuo do arquivo de build: Buildfile: build.xml dir: [mkdir] Created dir: C:\testes\classes compilar: [javac] Compiling 3 source files to C:\testes\classes empacotar: [mkdir] Created dir: C:\testes\build\jar [jar] Building jar: C:\testes\build\jar\Empresa.jar limpar: [delete] Deleting directory C:\testes\classes executar: [java] Funcionario: Osmar [java] Cliente: 324 BUILD SUCCESSFUL Total time: 8 seconds Como podemos ver por este resultado, nosso arquivo de build foi executado da maneira que espervamos. Abra o diretrio C:\testes\build\jar e ver que o arquivo Empresa.jarrealmente foi gerado. Caso deseje executa-lo novamente sem a ajuda do Ant basta abrir uma seo do DOS e digitar o comando abaixo: C:\testes\build\jar>java -jar Empresa.jar Vamos agora entender todas as tarefas contidas neste arquivo de build. Comece analisando o elemento project: <project name="teste" basedir="." default="executar">

Veja que o nome do projeto teste, o diretrio base o diretrio atual e a tarefa padro (no caso de omitirmos a tarefa na linha de comando) executar. Em seguida temos a tarefa property que nos permite definir uma varivel global chamada classes: <property name="classes" location="classes"/> Essa varivel ser usada para indicarmos para o arquivo de build o diretrio onde os arquivos .java devero ser colocados aps a compilao. Quando este arquivo de build executado temos uma srie de tarefas dependentes umas das outras. Por exemplo, a tarefa executar depende das tarefas empacotar e limpar. J a tarefa empacotar depende da tarefa compilar e assim por diante. Veja a seqncia da execuo das tarefas (assumindo que a tarefa padro seja executar): 1 2 3 4 5 dir compilar empacotar limpar executar

Veja o trecho da tarefa dir: <target name="dir"> <mkdir dir="classes" /> </target> Tudo que fazemos aqui criar um diretrio chamado classes. Em seguida observe a tarefa compilar: <target name="compilar" depends="dir"> <javac srcdir="${basedir}" classpath="${classes}" destdir="${classes}" /> </target> Para a tarefa javac definimos valores para trs atributos. So eles: 1. srcdir define o diretrio em que os arquivos .java a serem compilados se encontram. Usamos o atributo basedir para especificar o diretrio atual. 2. classpath - Usado para indicar ao compilador o(s) caminho(s) em que algumas classes necessrias ao correto processo de compilao de encontram. Para o caso de voc precisar especificar mais de um caminho, possvel usar vrgulas ou ponto-e-vrgula no valor do atributo. 3. destdir define o diretrio onde as classes compiladas sero gravadas. E agora, a tarefa mais importante do build, a tarefa responsvel por gerar o arquivo jar: <target name="empacotar" depends="compilar"> <mkdir dir="build/jar"/> <jar destfile="build/jar/Empresa.jar" basedir="${basedir}/classes"> <manifest> <attribute name="Main-Class" value="Empresa"/> </manifest> </jar> </target> O primeiro passo criar o diretrio onde o arquivo jar ser gravado: <mkdir dir="build/jar"/> Em seguida temos a tarefa jar. Esta tarefa possui os seguintes atributos: a) destfile o caminho e nome do arquivo jar a ser criado. b) basedir Diretrio a partir do qual os arquivos a serem includos no JAR sero pesquisados. Todo arquivo jar precisa ter o arquivo de manifesto. Este arquivo criado com o elemento manifest:

<manifest> <attribute name="Main-Class" value="Empresa"/> </manifest> aqui que fornecemos o nome da classe principal do aplicativo. Falhar em fornecer este valor far com que o arquivo jar no seja executado corretamente. Aps a gerao do arquivo jar, o diretrio classes excludo com a seguinte tarefa: <target name="limpar"> <delete dir="classes"/>

</target> E, finalmente, o aplicativo executado com a seguinte tarefa: <target name="executar" depends="empacotar, limpar"> <java jar="build/jar/Empresa.jar" fork="true"/> </target> Quando o valor true fornecido para o atributo fork da tarefa java, a execuo do arquivo feita em uma nova instancia a JVM e no aquela que est sendo usada para a execuo do Ant. Interagindo com o Ant via console durante a execuo dos arquivos de build At o tpico anterior todos os arquivos de build que escrevemos eram executados pelo Ant de uma s vez, ou seja, no havia a possibilidade de fazer escolhas ou definir valores aps o incio do processo. Neste tpico veremos como isso possvel. Uma das aplicaes mais interessantes da comunicao com o Ant aps o incio da execuo do arquivo de build solicitar nomes de diretrios ou arquivos ou ainda solicitar confirmao para uma tarefa a ser executada.

You might also like