Especialização em web com interfaces ricas Ferramentas de automação Prof. Fabrízzio Alphonsus A. M. N. Soares [email protected] [email protected] Instituto de Informática Universidade Federal de Goiás Aula 11 1 de junho de 2012 Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 1/108 Apache Ant Nesta aula iremos aprender a: Utilizar ferramentas para automação em tarefas de programação. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 2/108 Apache Ant I Com o Ant podemos realizar tarefas corriqueiras que vão desde a criação e exclusão de diretórios até o empacotamento de arquivos JAR e WAR. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 3/108 Apache Ant II Se você é desenvolver Java, mas ainda não conhece esta ferramenta, a leitura e releitura deste tutorial trarão muitos benefícios e redução de tempo no desenvolvimento de seus projetos. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 4/108 O que é o Apache Ant I O Apache Ant, ou simplesmente Ant, é uma ferramenta escrita em Java e usada para a automatização de builds e tarefas. Para desenvolvedores veteranos, o Ant é uma espécie de make, porém, mais simples de se configurar e usar. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 5/108 O que é o Apache Ant II O uso do Ant é justificado devido à quantidade de tarefas que devem ser executadas antes que uma aplicação esteja pronta para instalação ou distribuição final. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 6/108 O que é o Apache Ant III Entre estas tarefas estão: compilação de classes Java; criação ou exclusão de diretórios; empacotamento de arquivos; execução de programas externos; etc. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 7/108 O que é o Apache Ant IV 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 operações funcionam nos bastidores. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 8/108 O que é o Apache Ant V O processo de automação de tarefas usando o Ant está completamente centrado no uso de um documento XML que contém toda a informação sobre as tarefas a serem executadas. Como estes documentos XML são criados e configurados pelo desenvolvedor, recomendo que você reveja seus conhecimentos sobre esta linguagem de marcação antes de progredirmos. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 9/108 Baixando e instalando I Os passos descritos neste tópico guiarão você durante o processo de baixar, instalar e configurar a ferramenta Ant no Windows XP. De acordo com a documentação no endereço http://ant.apache.org/, esta ferramenta pode ser usada com sucesso em outras plataformas tais como Linux, Solaris, MacOS X, entre outros. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 10/108 Baixando e instalando II Para instalar o Apache Ant no Ubuntu Linux basta busca-lo no Synaptic. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 11/108 Baixando e instalando III Esta ula foi escrita usando-se a versão 1.8.2 do Ant (liberada em Dezembro de 2010). Para baixar a versão mais recente basta direcionar seu navegador para o endereço http://ant.apache.org/bindow e localizar o link apache-ant-x.y.z-bin.zip. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 12/108 Baixando e instalando IV 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 diretório. O resultado será uma pasta com o nome apache-ant-x.y.z-bin contendo outra pasta chamada apache-ant-x.y.z. Altere o nome da segunda pasta para ant e mova-a para o diretório raiz de seu sistema. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 13/108 Baixando e instalando V 2 A única exigência para que o Ant funcione corretamente é que você possua uma instalação recente do SDK JavaSE. Se você possui o Tomcat ou o servidor de aplicações do JavaEE instalado e rodando na sua máquina, não precisa se preocupar. O seu SDK JavaSE já está instalado e funcionando. Dessa forma, só precisamos adicionar o diretório bin do Ant ao path do sistema. No Windows XP isso é feito da seguinte forma: a. Vá até Iniciar -> Configurações -> Painel de Controle -> Sistema; b. Na aba “Avançado” clique em “Variáveis de Ambiente”; Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 14/108 Baixando e instalando VI c. Em “Variáveis de usuário para...” você tem as opções de incluir, alterar ou remover as variáveis e/ou seus valores. Se a variável PATH ainda não 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) reconheça o comando ant a partir de qualquer diretório. Se a variável PATH contiver mais de um valor, certifique-se de que esteja em um formato similar a: 1 C:\Sun\AppServer\bin;C:\Sun\AppServer\jdk\bin;C:\ant\ bin Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 15/108 Baixando e instalando VII 1 1 E agora, hora de testar o Ant. Se você seguiu todos os passos descritos para a instalação e configuração, 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: 1 Apache Ant version 1.8.2 compiled on December 27 2010. Se você detectou algum problema volte e certifique-se de que seguiu as instruções contidas aqui e também as dicas fornecidas no manual do Ant. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 16/108 Entendendo alvos, tarefas e o arquivo build.xml I A automatização de tarefas com o Ant é feita usando-se arquivos de configuração escritos em XML. Estes arquivos, geralmente chamados de build.xml possuem uma estrutura uniforme, variando apenas alguns elementos. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 17/108 Entendendo alvos, tarefas e o arquivo build.xml II Em geral, seguem o seguinte modelo: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <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> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 18/108 Entendendo alvos, tarefas e o arquivo build.xml III A raiz deste documento XML é o elemento project. Os elementosfilhos são chamados de target (alvo) que, por sua vez, possuem tasks (tarefas) como seus elementos-filhos. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 19/108 Entendendo alvos, tarefas e o arquivo build.xml IV Veja a definição dos três atributos para o elemento project: name: O nome do projeto. Este atributo pode ser omitido; basedir: O diretório base a partir do qual os demais caminhos para arquivos e diretórios serão calculados. O valor “.” define o diretório atual. Este atributo pode ser omitido; default: O alvo (target) padrão a ser usado quando nenhum alvo é especificado na linha de comando. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 20/108 Entendendo alvos, tarefas e o arquivo build.xml V Um elemento project pode conter um número 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 não pode ser omitido. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 21/108 Entendendo alvos, tarefas e o arquivo build.xml VI Tarefas (tasks) são trechos de código que podem ser executados dependendo do objetivo da aplicação e de qual alvo o Ant está executando no momento. Dentre as tarefas mais comuns estão: criar, renomear ou excluir diretórios, compilar e empacotar arquivos, etc. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 22/108 Criando diretórios e copiando arquivos usando Ant I Vamos um exemplo do uso do Apache Ant como ferramenta para criar diretórios e copiar arquivos. Para isso você deverá efetuar os seguintes passos: 1 2 3 Crie um diretório chamado “antTeste”. Lembre-se. Limite seus nomes de diretórios a oito caracteres no DOS; Dentro deste diretório crie um arquivo em branco chamado “index.jsp”; Abra o bloco de notas (ou seu editor favorito) e crie o seguinte documento XML: Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 23/108 Criando diretórios e copiando arquivos usando Ant II 1 2 3 4 5 6 <project name="teste" basedir="." default="alvo"> <target name="alvo"> <mkdir dir="paginas" /> <copy file="index.jsp" todir="paginas" /> </target> </project> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 24/108 Criando diretórios e copiando arquivos usando Ant III Salve este arquivo com o nome de build.xml no diretório antTeste. Se este diretório foi criado na raiz do seu sistema, você poderá abrir uma seção do DOS, navegar até o diretório antTeste e executar o seguinte comando: 1 C:\ANTTESTE>ant alvo Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 25/108 Criando diretórios e copiando arquivos usando Ant IV 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\pagina BUILD SUCCESSFUL Total time: 0 seconds Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 26/108 Criando diretórios e copiando arquivos usando Ant V Abra o diretório antTeste e verá que a pasta paginas foi criada e dentro desta temos uma cópia do arquivo index.jsp. Vamos entender como isso aconteceu: O elemento raiz do documento XML: 1 2 <project name="teste" basedir="." default="alvo"> </project> Define o diretório atual como valor para a propriedade basedir e define o target alvo como padrão. Desta maneira, o mesmo resultado poderia ser obtido omitindo o valor alvo na chamada ao Ant: Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 27/108 Criando diretórios e copiando arquivos usando Ant VI 1 C:\ANTTESTE>ant Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 28/108 Criando diretórios e copiando arquivos usando Ant VII Observe agora a estrutura do elemento target cujo nome é alvo: 1 2 3 4 <target name="alvo"> <mkdir dir="paginas" /> <copy file="index.jsp" todir="paginas" /> </target> Veja que a primeira tarefa deste alvo é criar o diretório “paginas”: 1 <mkdir dir="paginas" /> A segunda tarefa copia o arquivo index.jsp para o diretório paginas: Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 29/108 Criando diretórios e copiando arquivos usando Ant VIII 1 <copy file="index.jsp" todir="paginas" /> Como você pode ver, o atributo basedir foi definido, mas não o usamos durante a execução das tarefas (embora a ferramenta o tenha usado implicitamente para saber o diretório a partir do qual as tarefas propostas deveriam ser realizadas). Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 30/108 Usando variáveis durante o processo de automação de tarefas I O Apache Ant nos permite usar variáveis nos documentos XML usados na automação das tarefas. Este é um recurso interessante, pois torna o processo mais dinâmico e encoraja o reaproveitamento de código. Além disso, a ferramenta traz algumas variáveis embutidas e permite o acesso a propriedades do sistema, como veremos mais adiante. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 31/108 Usando variáveis durante o processo de automação de tarefas II Em geral o acesso a variáveis é feito na forma ${nome_da_variável}. Veja um exemplo de tarefa que cria uma pasta chamada paginas no diretório home do usuário atual: 1 2 3 <target name="diretorio"> <mkdir dir="${user.home}/paginas" /> </target> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 32/108 Usando variáveis durante o processo de automação de tarefas III Outra forma de se usar variáveis é declará-las globais usando a tarefa property. Isso é feito antes da declaração de qualquer elemento target. Veja um exemplo: 1 2 3 4 5 6 7 8 9 10 11 <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> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 33/108 Usando variáveis durante o processo de automação de tarefas IV Uma tarefa property possui muitos atributos. Para este exemplo estamos usando name e location. Veja suas definições: name: O valor da propriedade, ou seja, aquele que será referenciado como variável dentro das tarefas do documento XML. location: Associa a propriedade a um nome de arquivo ou diretório. Neste caso o caminho pode ser absoluto ou relativo. Sendo relativo, o caminho será expandido de acordo com o valor da propriedade basedir. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 34/108 Usando variáveis durante o processo de automação de tarefas V 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 Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 35/108 Usando variáveis durante o processo de automação de tarefas VI 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. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 36/108 Como compilar arquivos Java usando Ant I Nosso próximo exemplo é um pouco mais elaborado e coloca em prática alguns dos conceitos explicados nos tópicos anteriores. Desta vez você usará o Ant para compilar um arquivo .java, criar um diretório e mover para este diretório o resultado da compilação, ou seja, o arquivo com a extensão .class. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 37/108 Como compilar arquivos Java usando Ant II Para isso siga os seguintes passos: 1 2 1 2 3 4 5 Crie um diretório 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 (para sua comodidade este arquivo pode ser baixado clicando-se aqui): public class TesteAnt{ public static void main(String args[]){ System.out.println("Compilando com Ant"); } } Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 38/108 Como compilar arquivos Java usando Ant III 3 1 2 3 4 5 6 7 8 9 10 11 12 Salve este arquivo com o nome de TesteAnt.java no diretório que você criou no passo 1. 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> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 39/108 Como compilar arquivos Java usando Ant IV 13 14 4 1 </project> Salve este arquivo com o nome build.xml no diretório que você criou no passo 1. Hora do teste. Abra uma seção do DOS, navegue até o diretório que você criou e execute o comando: C:\TESTES>ant compilar Se você seguiu os passos anteriores atentamente, você verá o seguinte resultado: Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 40/108 Como compilar arquivos Java usando Ant V Buildfile: build.xml dir: [mkdir] Created dir: C:\TESTES\classes compilar: [javac] Compiling 1 source file to C:\TE BUILD SUCCESSFUL Total time: 2 seconds Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 41/108 Como compilar arquivos Java usando Ant VI Abra o diretório “c: testes” e verá a pasta classes. Dentro desta pasta você encontrará o arquivo TesteAnt.class. Realmente uma ferramenta muito útil, não? Vamos ver como isso aconteceu. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 42/108 Como compilar arquivos Java usando Ant VII Observação Importante: Se houver mais de um arquivo .java neste diretório todos eles serão compilados e os arquivos .class correspondentes serão copiados para a pasta classes. Existe, porém, uma ressalva nesta regra: somente arquivos .java que não possuem seus arquivos .class correspondentes ou arquivos .java mais recentes que seus arquivos .class é que serão compilados. Mais adiantes veremos o uso de filtros para compilar apenas determinados arquivos. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 43/108 Como compilar arquivos Java usando Ant VIII 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: 1 <target name="compilar" depends="dir"> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 44/108 Como compilar arquivos Java usando Ant IX Veja que ao usarmos o atributo depends, estamos informando ao Ant que a tarefa compilar deverá ser executada somente após a execução da tarefa dir. E, nem precisamos chamar esta tarefa a partir da linha de comando. O Ant se encarrega de tudo. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 45/108 Como compilar arquivos Java usando Ant X Após a criação do diretório classes na tarefa dir: 1 2 3 <target name="dir"> <mkdir dir="classes" /> </target> temos a tarefa que compila o arquivo .java e copia o resultado (o arquivo .class) para o diretório classes: 1 2 3 4 <target name="compilar" depends="dir"> <javac srcdir="${basedir}" destdir="${classes}" /> </target> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 46/108 Como compilar arquivos Java usando Ant XI Veja que para este exemplo fornecemos ao compilador Java apenas o diretório de saída (srcdir) e o diretório de destino (destdir). É possível fornecer mais informações tais como classpath, target, etc. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 47/108 Uso do Ant na execução de aplicativos Java I Vamos ver como é possível executar o arquivo resultante da compilação (arquivos .class). Para isto vamos modificar o documento XML usado no exemplo anterior para esta nova versão: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <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> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 48/108 Uso do Ant na execução de aplicativos Java II 15 16 17 18 19 20 21 <target name="executar" depends="dir, compilar"> <java classname="${arquivo}" > <classpath path="${classes}" /> </java> </target> </project> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 49/108 Uso do Ant na execução de aplicativos Java III Este arquivo XML contém informações para algumas tarefas um pouco mais complexas. Comece analisando a segunda tarefa property: 1 <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 diretório classes é criado com o seguinte alvo: 1 2 3 <target name="dir"> <mkdir dir="classes" /> </target> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 50/108 Uso do Ant na execução de aplicativos Java IV Para compilar o arquivo TesteAnt.java e copiá-lo para a pasta classes usamos o alvo: 1 2 3 4 <target name="compilar" depends="dir"> <javac srcdir="${basedir}" destdir="${classes}" /> </target> Finalmente, executamos o arquivo resultante (TesteAnt.class) usando o alvo: Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 51/108 Uso do Ant na execução de aplicativos Java V 1 2 3 4 5 <target name="executar" depends="dir, compilar"> <java classname="${arquivo}" > <classpath path="${classes}" /> </java> </target> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 52/108 Uso do Ant na execução de aplicativos Java VI Veja que esta tarefa depende das duas tarefas anteriores. Desta forma, você poderá executar o Ant fornecendo o alvo executar como argumento: 1 Ant executar Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 53/108 Uso do Ant na execução de aplicativos Java VII Dentre os argumentos que podem ser fornecidos para a tarefa java, os mais importantes são classname (o nome da classe a ser executada) e classpath (o caminho para o diretório que contem a(s) classe(s)). Observe que temos que usar o atributo path juntamente com o argumento classpath. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 54/108 Uso do Ant na execução de aplicativos Java VIII Como sugestão, recomendo que você investigue na documentação do Ant outros argumentos possíveis. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 55/108 Exibindo mensagens durante o processo de automação das tarefas I Durante o processo de execução das diversas tarefas definidas no documento XML, é possível exibir mensagens usando a tarefa echo. Este procedimento é útil quando precisamos de um feedback visual dos procedimentos realizados pelo Ant. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 56/108 Exibindo mensagens durante o processo de automação das tarefas II O documento XML a seguir mostra a você como se certificar de que os valores fornecidos para algumas variáveis são realmente aqueles que você precisa durante a realização das tarefas. O exemplo mostra ainda como exibir valores das variáveis embutidas no Ant: Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 57/108 Exibindo mensagens durante o processo de automação das tarefas III 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <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> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 58/108 Exibindo mensagens durante o processo de automação das tarefas IV 17 18 19 20 21 22 23 24 25 26 27 28 29 <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> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 59/108 Exibindo mensagens durante o processo de automação das tarefas V Este documento XML apresenta a tarefa Tstamp. Esta tarefa é muito útil quando queremos exibir informações sobre a hora e a data em que o arquivo que a contém foi processado pelo Ant. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 60/108 Exibindo mensagens durante o processo de automação das tarefas VI Seu propósito é definir as propriedades DSTAMP, TSTAMP e TODAY. Por padrão, 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. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 61/108 Exibindo mensagens durante o processo de automação das tarefas VII Veja como o usamos no exemplo: 1 2 3 4 <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 três atributos: 1 2 O primeiro atributo define a variável global que poderá ser acessada nas tarefas do documento. O segundo atributo é o padrão de data a ser aplicado e o ultimo atributo fornece a identificação do país que possui o padrão de data usado. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 62/108 Exibindo mensagens durante o processo de automação das tarefas VIII 3 O atributo locale pode ser omitido sem prejudicar a estrutura do documento. Por enquanto, saiba que as variáveis horas e data poderão ser acessadas em todo o documento XML usando-se os formatos ${data} e ${horas}. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 63/108 Exibindo mensagens durante o processo de automação das tarefas IX Após a definição da tarefa Tstamp, temos uma tarefa property: 1 <property name="projeto.nome" value="TesteEcho"/> Usamos esta tarefa para fornecer um nome para o projeto. Veja que é possível usar pontos (.) nos nomes das tarefas property. Isso facilita a criação de hierarquias. A partir deste ponto o nome do projeto pode ser acessado usando-se ${projeto.nome}. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 64/108 Exibindo mensagens durante o processo de automação das tarefas X O primeiro alvo, que pode ser invocado por “ant exibir”, executa apenas a tarefa echo. Como resultado, teremos apenas a exibição, no console, do texto entre as tags <echo></echo>: 1 2 3 4 5 6 <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> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 65/108 Exibindo mensagens durante o processo de automação das tarefas XI O segundo alvo, que pode ser invocado por “ant java”, executa outra tarefa echo. Desta vez temos a exibição do local de instalação do Java: 1 2 3 <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 tarefa echo para exibir o nome do projeto e a data e hora da execução das tarefas. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 66/108 Como gerar arquivos JAR usando Ant I Agora que você já conhece algumas das tarefas básicas da ferramenta Ant, podemos avançar um pouco mais. Neste tópico você aprenderá como escrever um aplicativo Java composto de três classes. Em seguida escreverá um arquivo de build que compilará estas classes. Finalmente você as colocará em um arquivo Jar para distribuição. Lembre-se de que todo o processo de compilação das classes e geração do arquivo Jar deverá ser feito por um único arquivo de build. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 67/108 Como gerar arquivos JAR usando Ant II O primeiro passo será escrever os arquivos .java que farão parte do exemplo. Este é um aplicativo simples composto de três classes chamadas Empresa, Funcionario e Cliente (boa hora para praticar composição). Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 68/108 Como gerar arquivos JAR usando Ant III Para acompanhar este exemplo você deverá criar um diretório chamado testes em seu sistema (no meu sistema estou usando “C: testes”). Em seguida crie três arquivos .java de acordo com as listagens seguintes: Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 69/108 Como gerar arquivos JAR usando Ant IV 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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; } } Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 70/108 Como gerar arquivos JAR usando Ant V 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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; } } Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 71/108 Como gerar arquivos JAR usando Ant VI 1 2 3 4 5 6 7 8 9 10 11 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("Funcionário: " + func.getNome()); System.out.println("Cliente: " + cli.getCodigo()); System.exit(0); } } Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 72/108 Como gerar arquivos JAR usando Ant VII Este exemplo é muito simples. Tudo que temos aqui é uma classe pública (Empresa) que constrói instancias de duas classes que possuem acesso de pacote. Não entraremos em detalhes sobre o funcionamento de cada uma. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 73/108 Como gerar arquivos JAR usando Ant VIII 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: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <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}" /> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 74/108 Como gerar arquivos JAR usando Ant IX 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 </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> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 75/108 Como gerar arquivos JAR usando Ant X Antes de executarmos este exemplo certifique-se de ter efetuado todos os passos descritos anteriormente, ou seja, você deverá ter um diretório chamado C: testes contendo três arquivos .java e o arquivo de build (build.xml). Agora é só abrir uma seção do DOS, navegar até C: testes e inserir o comando abaixo: 1 C:\testes>ant Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 76/108 Como gerar arquivos JAR usando Ant XI Veja o resultado da execução do arquivo de build: Buildfile: build.xml dir: [mkdir] Created dir: C:\testes\classes compilar: [javac] Compiling 3 source files to C:\test empacotar: [mkdir] Created dir: C:\testes\build\jar [jar] Building jar: C:\testes\build\jar\Emp Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 77/108 Como gerar arquivos JAR usando Ant XII limpar: [delete] Deleting directory C:\testes\class executar: [java] Funcionario: Osmar [java] Cliente: 324 BUILD SUCCESSFUL Total time: 8 seconds Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 78/108 Como gerar arquivos JAR usando Ant XIII Como podemos ver por este resultado, nosso arquivo de build foi executado da maneira que esperávamos. Abra o diretório C: testes build jar e verá que o arquivo Empresa.jar realmente foi gerado. Caso deseje executa-lo novamente sem a ajuda do Ant basta abrir uma seção do DOS e digitar o comando abaixo: 1 C:\testes\build\jar>java -jar Empresa.jar Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 79/108 Como gerar arquivos JAR usando Ant XIV Vamos agora entender todas as tarefas contidas neste arquivo de build. Comece analisando o elemento project: 1 <project name="teste" basedir="." default="executar"> Veja que o nome do projeto é teste, o diretório base é o diretório atual e a tarefa padrão (no caso de omitirmos a tarefa na linha de comando) é executar. Em seguida temos a tarefa property que nos permite definir uma variável global chamada classes: 1 <property name="classes" location="classes"/> Essa variável será usada para indicarmos para o arquivo de build o diretório onde os arquivos .java deverão ser colocados após a compilação. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 80/108 Como gerar arquivos JAR usando Ant XV Quando este arquivo de build é executado temos uma série 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 seqüência da execução das tarefas (assumindo que a tarefa padrão seja executar): 1 2 3 4 5 dir compilar empacotar limpar executar Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 81/108 Como gerar arquivos JAR usando Ant XVI Veja o trecho da tarefa dir: 1 2 3 <target name="dir"> <mkdir dir="classes" /> </target> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 82/108 Como gerar arquivos JAR usando Ant XVII Tudo que fazemos aqui é criar um diretório chamado classes. Em seguida observe a tarefa compilar: 1 2 3 4 5 <target name="compilar" depends="dir"> <javac srcdir="${basedir}" classpath="${classes}" destdir="${classes}" /> </target> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 83/108 Como gerar arquivos JAR usando Ant XVIII Para a tarefa javac definimos valores para três atributos. São eles: srcdir define o diretório em que os arquivos .java a serem compilados se encontram. Usamos o atributo basedir para especificar o diretório atual. classpath Usado para indicar ao compilador o(s) caminho(s) em que algumas classes necessárias ao correto processo de compilação de encontram. Para o caso de você precisar especificar mais de um caminho, é possível usar vírgulas ou ponto-e-vírgula no valor do atributo. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 84/108 Como gerar arquivos JAR usando Ant XIX destdir define o diretório onde as classes compiladas serão gravadas. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 85/108 Como gerar arquivos JAR usando Ant XX E agora, a tarefa mais importante do build, a tarefa responsável por gerar o arquivo jar: 1 2 3 4 5 6 7 8 9 <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> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 86/108 Como gerar arquivos JAR usando Ant XXI O primeiro passo é criar o diretório onde o arquivo jar será gravado: <mkdir dir="build/jar"/> Em seguida temos a tarefa jar. Esta tarefa possui os seguintes atributos: 1 destfile - É o caminho e nome do arquivo jar a ser criado. 2 basedir - Diretório a partir do qual os arquivos a serem incluídos no JAR serão pesquisados. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 87/108 Como gerar arquivos JAR usando Ant XXII Todo arquivo jar precisa ter o arquivo de manifesto. Este arquivo é criado com o elemento manifest: 1 2 3 <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 não seja executado corretamente. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 88/108 Como gerar arquivos JAR usando Ant XXIII Após a geração do arquivo jar, o diretório classes é excluído com a seguinte tarefa: 1 2 3 <target name="limpar"> <delete dir="classes"/> </target> E, finalmente, o aplicativo é executado com a seguinte tarefa: 1 2 3 <target name="executar" depends="empacotar, limpar"> <java jar="build/jar/Empresa.jar" fork="true"/> </target> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 89/108 Como gerar arquivos JAR usando Ant XXIV Quando o valor true é fornecido para o atributo fork da tarefa java, a execução do arquivo é feita em uma nova instancia da JVM e não aquela que está sendo usada para a execução do Ant. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 90/108 Interagindo com o Ant via console durante a execução dos arquivos de build I Uma das aplicações mais interessantes da comunicação com o Ant após o início da execução do arquivo de build é solicitar nomes de diretórios ou arquivos ou ainda solicitar confirmação para uma tarefa a ser executada. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 91/108 Interagindo com o Ant via console durante a execução dos arquivos de build II A tarefa input é usada quando queremos pausar a execução do Ant e esperar pelo pressionamento de alguma tecla ou informação do usuário. Veja um exemplo: 1 <input/> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 92/108 Interagindo com o Ant via console durante a execução dos arquivos de build III O simples fato de inserir esta tarefa no fluxo de execução de um determinado alvo fará com que a execução do build seja interrompida e recomece somente quando você pressionar a tecla Enter. É claro que é sempre uma boa idéia informar o usuário sobre este procedimento. Assim, uma abordagem melhor é usar: 1 <input>Tecle Enter para continuar...</input> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 93/108 Interagindo com o Ant via console durante a execução dos arquivos de build IV Caso você desejar a confirmação do usuário antes de proceder com a execução do arquivo de build poderá usar o seguinte código (como um exemplo vale mais que 1000 palavras, o build a seguir pede confirmação antes de criar um diretório e copiar um arquivo): 1 2 3 4 5 6 7 8 9 10 <project name="teste" basedir="." default="alvo"> <target name="alvo"> <input message="O diretorio paginas sera criado agora. Deseja continuar (s/n)?" validargs="s,n" addproperty="valor" /> <condition property="sair"> <equals arg1="n" arg2="${valor}"/> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 94/108 Interagindo com o Ant via console durante a execução dos arquivos de build V 11 12 13 14 15 16 17 18 </condition> <fail if="sair">O processo de build foi cancelado.</fail > <mkdir dir="paginas" /> <copy file="index.jsp" todir="paginas" /> </target> </project> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 95/108 Interagindo com o Ant via console durante a execução dos arquivos de build VI C:\testes>ant Buildfile: build.xml alvo: [input] O diretorio paginas sera criado ago s [mkdir] Created dir: C:\testes\paginas [copy] Copying 1 file to C:\testes\paginas BUILD SUCCESSFUL Total time: 10 seconds Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 96/108 Interagindo com o Ant via console durante a execução dos arquivos de build VII Veja que aqui a resposta para a pergunta foi “s”. Se respondermos “n” teremos outro resultado. Observe: C:\testes>ant Buildfile: build.xml alvo: [input] O diretorio paginas sera criado ago n BUILD FAILED C:\testes\build.xml:11: O processo de build foi Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 97/108 Interagindo com o Ant via console durante a execução dos arquivos de build VIII Total time: 2 seconds Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 98/108 Interagindo com o Ant via console durante a execução dos arquivos de build IX O primeiro passo para entender este arquivo de build é começar analisando a tarefa input: 1 2 3 4 5 <input message="O diretorio paginas sera criado agora. Deseja continuar (s/n)?" validargs="s,n" addproperty="valor" /> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 99/108 Interagindo com o Ant via console durante a execução dos arquivos de build X Veja que aqui temos três atributos. Veja suas definições a seguir: 1 2 3 message - É a mensagem a ser exibida para o usuário; validargs - Uma string contendo as palavras (ou letras) válidas como argumento de entrada no console. Observe que validarags é sensitiva à maiúsculas e minúsculas. Em nosso exemplo aceitamos somente “s” e “n”. Se quiséssemos aceitar também “S” e “N” bastaria acrescentar estas letras ao valor do atributo. addproperty - Permite criar uma variável global que armazenará o valor informado pelo usuário. Este atributo é muito importante, como veremos mais adiante. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 100/108 Interagindo com o Ant via console durante a execução dos arquivos de build XI Logo após o elemento input temos uma condição: 1 2 3 <condition property="sair"> <equals arg1="n" arg2="${valor}"/> </condition> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 101/108 Interagindo com o Ant via console durante a execução dos arquivos de build XII Esta condição define uma propriedade (ou seria melhor chamála de variável?) global chamada sair. Inicialmente o valor para esta propriedade é false. Dentro do elemento condition temos um elemento equals que compara o valor informado pelo usuário (presente em arg2) com um dos valores válidos como entrada. No nosso exemplo, a propriedade sair terá o valor true se o valor informado pelo usuário for igual a “n”. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 102/108 Interagindo com o Ant via console durante a execução dos arquivos de build XIII E agora o trecho mais importante: um elemento fail: 1 <fail if="sair">O processo de build foi cancelado.</fail> Este elemento possui apenas um atributo (a mensagem a ser exibida) e é usado para testarmos valores de propriedades para decidir se a execução do build deverá prosseguir ou ser interrompida. Veja como testamos o valor da propriedade sair definida anteriormente no elemento condition. É importante observar que, se o teste efetuado no elemento fail resultar verdadeiro, a execução do arquivo é interrompida, ou seja, nenhuma linha de código após este elemento será executada. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 103/108 Como obter valores via console durante a execução de um build Ant I Nosso próximo exemplo mostra como solicitar ao usuário que forneça o nome de um diretório a ser criado. Observe que se o usuário não fornecer um valor, ou seja, simplesmente pressionar Enter, o arquivo de build se encarregará de fornecer um valor padrão para o diretório. Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 104/108 Como obter valores via console durante a execução de um build Ant II Veja a listagem: 1 2 3 4 5 6 7 8 9 10 11 12 13 <project name="teste" basedir="." default="dir"> <target name="dir"> <input message="Forneca um nome para o diretorio a ser criado e pressione Enter:" addproperty="diretorio" defaultvalue="paginas" /> <mkdir dir="${diretorio}" /> </target> </project> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 105/108 Como obter valores via console durante a execução de um build Ant III Execute este arquivo de build e terá o resultado mostrado a seguir: C:\testes>ant Buildfile: build.xml dir: [input] Forneca um nome para o diretorio a pressione Enter: estudos [mkdir] Created dir: C:\testes\estudos BUILD SUCCESSFUL Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 106/108 Como obter valores via console durante a execução de um build Ant IV Total time: 6 seconds Veja que forneci o nome “estudos” para o diretório a ser criado. Experimente agora executar o arquivo novamente e, pressione Enter sem informar valor algum. Veja como o diretório paginas será criado. O trecho mais importante deste arquivo é a propriedade defaultvalue que possibilita definir um valor default (padrão) para a propriedade diretorio caso o usuário pressione Enter sem informar um valor: Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 107/108 Como obter valores via console durante a execução de um build Ant V 1 2 3 4 5 <input message="Forneca um nome para o diretorio a ser criado e pressione Enter:" addproperty="diretorio" defaultvalue="paginas" /> Prof. Fabrízzio Alphonsus A. M. N. Soares | Ferramentas de automação 108/108