82
Abaporu @ JavaONE 2003 Helder da Rocha ([email protected]) argonavis.com.br Como construir um Ambiente de desenvolvimento Java com JEdit e Ant Como construir um Ambiente de desenvolvimento Java com JEdit e Ant

Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha ([email protected]) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

  • Upload
    others

  • View
    23

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

Abaporu @ JavaONE 2003

Helder da Rocha ([email protected]) argonavis.com.br

Como construir um Ambiente de

desenvolvimento Java com JEdit e Ant

Como construir um Ambiente de

desenvolvimento Java com JEdit e Ant

Page 2: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

2argo

navis

.com

.br

Objetivos

Propor uma alternativa leve e barata para desenvolvimento de aplicações Java integradas com XML, HTML, JSP, etc.Apresentar o JEdit e principais plug-insApresentar o Ant e principais recursosMostrar como manter um projeto com JEdit, Ant e outras ferramentas open-source

Esta palestra é parcialmente baseada no artigo "Seu Ambiente Java Completo", por Helder da Rocha,

Java Magazine, no. 3

Page 3: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

3argo

navis

.com

.br

JEdit?

JEdit é um editor de textos desenvolvido como um projeto open-source iniciado por Slava PestovÉ um projeto maduro que está em desenvolvimento hámais de 5 anosSupera vários editores e ambientes de desenvolvimento comerciais em relação a recursos e facilidade de usoRoda em qualquer plataforma JavaPossui lunguagem de macro e API para plug-insAltamente configurável e extensívelFaz auto-endentação e code-highlight para mais de 80 linguagens

Page 4: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

4argo

navis

.com

.br

Só um editor de textos?

À primeira vista, o JEdit parece apenas mais um editor de textos com algumas facilidades para edição de código

Cores para palavras-chaveEndentação automáticaCombinação de pares de chaves e parênteses

Page 5: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

5argo

navis

.com

.br

JEdit + plug-ins + Ant + J2SDK = IDEUsando seus plug-ins, J2SDK, Ant, CVS e outras ferramentas gratuitas, o JEdit torna-se um poderoso, porém leve, ambiente de desenvolvimento integrado

Buffer Tabs

Ant Farm

XML e CodeAid

Project Viewer

XML, XSLT

Console

Error List

Page 6: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

6argo

navis

.com

.br

JEdit IDE: Receita de boloIngredientes

Plataforma desktop compatível com Java: Windows, Mac, Linux, Solaris, AIX, etc.J2SDK mais recente (java.sun.com)JEdit mais recente (www.jedit.org)Apache Ant mais recente (ant.apache.org)Conexão internet ou JARs de plug-ins do JEdit

Procedimento1) Instale o J2SDK2) Configure as variáveis de ambiente (JAVA_HOME)3) Abra o ZIP do Ant e inclua o ANT_HOME/bin no PATH4) Execute o JAR de instalação do JEdit5) Instale os plug-ins desejados (incluindo o AntFarm)6) Configure os plug-ins

Page 7: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

7argo

navis

.com

.br

Instalação e teste do J2SDK

O Java 2 SDK oferece um ambiente de desenvolvimento Java com ferramentas que executam através da linha de comandoPara instalar, siga as instruções referentes ao seu sistema operacional e lembre-se do local de instalação, que é o seu "Java Home"Configure as seguintes variáveis de ambiente

JAVA_HOME: local de instalação do J2SDKPATH: acrescente $JAVA_HOME/bin (Unix) ou %JAVA_HOME%\bin no seu PATH

Para testar, execute "javac" em qualquer janela de terminal

Page 8: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

8argo

navis

.com

.br

Instalação e teste do Ant

Abra o ZIP do Ant e associe o diretório de instalação àvariável de ambiente ANT_HOMEPara testar o Ant e as variáveis de ambiente, execute "ant" em qualquer janela de terminalO resultado da execução deve ser:Buildfile: build.xml does not exist!Build failed

Se o comando não for reconhecido pelo sistema, verifique se a instalação realmente aconteceu, e se

$ANT_HOME/bin (ou %ANT_HOME%\bin) está no PATH: execute o caminho completo $ANT_HOME/bin/antANT_HOME foi definido corretamente: execute o caminho completo /local/da/instalacao/bin/ant

Page 9: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

9argo

navis

.com

.br

Espaço de Ambiente: Windows 98/ME

Em ambientes Windows domésticos antigos (ME, 98) a execução do Ant pode causar um erro de "falta de espaço de ambiente"

Esses sistemas só reservam 256 bytes para guardar variáveis de ambiente

Para aumentar o espaço de ambiente, edite o arquivo c:\config.sys e acrescente no final, a linha:shell=c:\command.com /e:8192 /p

Isto aumentará o espaço para 8kb, o que é suficiente para rodar o Ant e várias outras aplicações que usam muito espaço de ambiente

Page 10: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

10argo

navis

.com

.br

Instalação e execução do JEdit

Instale o JEdit clicando no arquivo JAR baixado do site www.jedit.org. Se isto não funcionar, execute> java -jar jeditInstall.jar

A instalação é simples. Basta seguir os passos indicados na janela

No Windows, o JEdit criará por default ícones na área de trabalho e menu de aplicaçõesNos sistemas Unix, o JEdit poderá ser executado em linha de comando, usando:> jedit & ou

Antes de começar a escrever, salve o arquivo com a extensão desejada (.xml, .java, .cpp) para que o JEdit reconheça o tipo de arquivo.

Page 11: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

11argo

navis

.com

.br

Instalação de plug-ins

O JEdit, sem plug-ins, é um simples editor de textosCom Plug-ins, ele é comparável a um sofisticado ambiente de desenvolvimento integrado (IDE)Há duas formas de instalar plug-ins

Baixar os JARs e copiá-los para o diretório jars da instalação JEdit ou do perfil do usuário (diretório .jedit)Em tempo real (com conexão Internet)

A segunda forma é mais segura e evita erros

Somente plug-ins compatíveis com a versão do JEdit aparecem na listaNo download, plug-ins e suas dependências são instalados

Use Plugins / Plugin Manager

Atualizar versão

Instalar

Remover

Page 12: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

12argo

navis

.com

.br

Sugestão de plug-ins

Existe uma quantidade enorme de plug-ins, para as mais variadas finalidades

Não instale todos pois alguns podem causar conflitosLeia a descrição e marque o plug-in desejado

Alguns plug-ins úteisConsoleError ListAnt FarmBuffer TabsJSwatProject ViewerJBrowseXML

JavaStyleDot CompleteAnt HelperTemplatesXML IndenterJDiffJCompilerXSLT

Page 13: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

13argo

navis

.com

.br

Plug-in bugs

Embora usem uma API padrão do JEdit, os plug-ins são desenvolvidos por equipes independentes

A integração entre Plug-ins nem sempre é perfeitaAlguns plug-ins podem causar conflitos com outros existentes

A solução é ler a mensagem de erro e tentar consertar o problema, ou desinstalar o plug-in defeituosoUm problema comum é a falta do tools.jar, que contém o compilador javac

Solução: copie o tools.jar encontrado no diretório lib/ da instalação do J2SDK para o diretório jars da instalação do JEdit

Page 14: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

14argo

navis

.com

.br

Docking

Alguns plug-ins possuem interface para interação com o usuárioA interface por default aparece como uma janela flutuante.Para plug-ins usados com freqüência, pode ser mais cômodo posicioná-la na janela principalPara configurar o docking, selecione o menu Global Options / Docking e escolha a configuração desejada

Sugestões de docking:Console e ErrorList: bottomAntFarm e JBrowse: leftProject Viewer e JSwat: right

Page 15: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

15argo

navis

.com

.br

Configuração do JEdit e plug-ins

Várias cónfigurações permitem tornar o JEdit mais amigável para o seu ambiente de desenvolvimentoVários plug-ins requerem (ou ficam mais amigáveis) com alguma configuraçãoPara configurar o JEdit e plug-ins, selecione o menu Utilities/Global Options na interface do JEditConfigurações básicas

Tamanho da endentação (def. 8): Editing / Tab WidthNúmeros das linhas: Gutter / Line NumberingProxies HTTP: Proxy ServersTamanho do texto: Text Area / Text Font

Page 16: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

16argo

navis

.com

.br

Console

Um dos plug-ins mais úteis é o ConsoleReproduz a console de execução, compilação e outras operações dentro do ambiente do JEditPermite que saída dos aplicativos seja utilizada por outros plug-ins (por exemplo: Error List)

Por default, Console aparece em uma janela flutuante. Se usar docking, é preciso tomar alguns cuidados com aplicativos que não terminam

Há um bug que pode impedir o término da execução (isto iráacumular processos tornando o JEdit lento)Execute tarefas desse tipo em janelas flutuantes.

Prompt do Console

Page 17: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

17argo

navis

.com

.br

Buffer Tabs

Buffer Tabs permitem trocar a forma de seleção dos buffers de texto por tabs. Para isto é preciso

1) Remover o "Buffer Switcher", instalado por default2) Configurar "Buffer Tabs" como default

Buffer Tabs

1) Desmarcar2) Marcar 3) Selecionar

Plug-in

Page 18: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

18argo

navis

.com

.br

Error List

Error List integra-se com o plug-in Console, e filtra erros de compilação, validação XML, etc.O resultado é apresentado em uma janela que responde a eventos e permite saltar diretamente à

página elinha ondeocorreu o erro

Page 19: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

19argo

navis

.com

.br

Configuração de ErrorList

Error List acomoda-se bem no mesmo espaço que o Console (use docking "bottom" para ambos)Para que as mensagens de erro apareçam logo após a compilação/validação, configure o Error List com a opção "Automatically Display on Error"

Page 20: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

20argo

navis

.com

.br

Project Viewer

O Project Viewer permite ter diferentes ambientes de trabalho para cada projeto

Ao selecionar um projeto existente, todos os arquivos abertos na última sessão são lembradosNovos arquivos podem ser automaticamente incluídos no projeto

Integra-se bem com o AntFarm

Em geral, cadaprojeto deveter umbuild.xml

Page 21: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

21argo

navis

.com

.br

Debugging e Testes

JSwat é um debugger. Através dele pode-se marcar pontos de interrupção, obter diagnósticos e navegar através da execução de uma aplicaçãoAtravés do plug-in Templatepode-se gerar código para TestCases do JUnit

O JUnit pode ser executado dentro do JEdit a partir da sua integração com o Ant

Page 22: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

22argo

navis

.com

.br

Ajuda de contexto

CodeAid e DotComplete auxiliam o desenvolvedor com informações sobre métodos e atributos que podem ser usados em um contextoAo se digitar um "." após uma variável, uma lista com os métodos e atributos disponíveis é exibida

Page 23: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

23argo

navis

.com

.br

Plug-in XML

O plug-in de XML garante que o XML digitado seja bem formadoXMLs mal formados têm os erros indicados no texto e no Console/ErrorList

XML também pode validar XML se um esquema (DTD ou XML Schema) estiver associado com eleUsando um esquema, o JEdit oferece ajuda de contexto (mostrando quais tags podem ser usados no contexto e que atributos podem ser usados)

Este DTD define as regras usadas pelo plug-in

Page 24: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

24argo

navis

.com

.br

Formatação de código

JavaStyle, Jalopy e vários outros plug-ins reformatam código Java de acordo com um estilo pré-definido

Endentação automáticaPosição das chaves (depois dos métodos ou linha seguinte)Comentários Javadoc geradosOutras opções configuráveis

O código precisa estar bem formadoXML Indenter faz a mesma coisa com arquivos XML

Page 25: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

25argo

navis

.com

.br

JBrowse

JBrowse permite acesso rápido a métodos de uma classeIndispensável em classes grandes!

Para configurar (Global Options), marque pelo menos a opção "Automatic Parse" para que a lista seja atualizada sempre que uma nova classe estiver na janela principal

Page 26: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

26argo

navis

.com

.br

Ant Farm

AntFarm oferece uma interface para a execuçãode alvos de um build.xml através do Ant

Cada alvo aparece como uma opção de menuCom o AntFarm, o JEdit alcança um nível deintegração comparável aos IDEs comerciais: Selecionando-se uma opção de menu, pode-se

Montar toda a aplicação (compilar, integrar)Executar a aplicação (produção ou debug)Gerar classes, documentos XML, etc. (templates)Rodar testes, benchmarks, validadoresGerar documentação (JavaDoc, executar templates, gerar relatórios HTML e PDF)Distribuir releases (criar JARs, WARs, EARS, deploy, ftp)Manter histórico local ou distribuído (CVS e similares)Executar e interagir com aplicações externas

Page 27: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

27argo

navis

.com

.br

Configuração do AntFarm

O JEdit precisa saber a localização do script do Ant para executá-lo em uma JVM a parteAlém disso, é útil ter algumas configurações default

Para integração com o Project Viewer

Localização do script do ant

Gravar todos os buffers do JEdit antes de iniciar qualquer target

Page 28: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

28argo

navis

.com

.br

Extensão através do Ant

Todas as tarefas baseadas na integração pelo Ant podem ser executadas sem o JEdit

É o Ant que realiza tudo. O JEdit apenas oferece a interface e responde aos eventos do Ant

É em torno do Ant, portanto, que deve ser feita a organização do projeto, como

Estrutura de diretórios, nomes dos targets, etc.Rotinas de compilação, build, testes, execução, deployGeração de código, documentação, etc.

Projeto baseado no Ant pode ser montado em qualquer plataforma ou ambiente (IDE ou linha de comando)A seguir apresentaremos breve tutorial sobre Ant e como montar e gerenciar um ambiente de desenvolvimento

Page 29: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

29argo

navis

.com

.br

O que é Ant?

Uma ferramenta para construção de aplicaçõesImplementada em JavaBaseada em roteiros XMLExtensível (via scripts ou classes)'padrão' do mercadoOpen Source (Grupo Apache, Projeto Jakarta)

Semelhante a make, porémMais simples e estruturada (XML)Mais adequada a tarefas comuns em projetos JavaIndependente de plataforma

Onde encontrar: http://ant.apache.org

Page 30: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

30argo

navis

.com

.br

Para que serve?Para montar praticamente qualquer aplicação Java que consista de mais que meia dúzia de classes;Aplicações

Distribuídas em pacotesQue requerem a definição de classpaths locais, e precisam vincular código a bibliotecas (JARs)Cuja criação/instalação depende de mais que umasimples chamada ao javac. Ex: RMI, CORBA, EJB, servlets, JSP,...

Para automatizar processos frequentesJavadoc, XSLT, implantação de serviços Web e J2EE (deployment), CVS, criação de JARs, testes, FTP, email

Page 31: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

31argo

navis

.com

.br

Como funciona?Ant executa roteiros escritos em XML: 'buildfiles'Cada projeto do Ant possui um buildfile

Subprojetos podem ter, opcionalmente, buildfilesadicionais chamados durante a execução do primeiro

Cada projeto possui uma coleção de alvosCada alvo consiste de uma seqüência de tarefasExemplos de execução

antProcura build.xml no diretório atual e roda alvo default

ant -buildfile outro.xml Executa alvo default de arquivo outro.xml

ant compilarRoda alvo 'compilar' e possíveis dependências em build.xml

Page 32: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

32argo

navis

.com

.br

Como funciona (2)<xml><xml><xml><xml>

build.xml

Ant

<javac>

<ejb-jar>

<javadoc>

*.java

*.class *.html

ejb-jar.jardocs.zip

CVS

<jar update="true">*.class

subproj<xml><xml>

build.xml *.java

<javac>

<cvs>

<ftp>

<copy> <mimemail>

<junit>

Testes

<ant><xml><xml>

deploy

ejb-jar.xml

<xdoclet>

Page 33: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

33argo

navis

.com

.br

O buildfile é um arquivo XML: build.xml (default)Principais elementos<project default="alvo_default">

Elemento raiz (obrigatório): define o projeto.<target name="nome_do_alvo">

Coleção de tarefas a serem executadas em seqüênciaPode-se estabelecer dependências entre alvosDeve haver pelo menos um <target>

<property name="nome" value="valor">Pares nome/valor usados em atributos dos elementos do build.xml da forma ${nome}Propriedades também podem ser definidas em linha de comando (-Dnome=valor) ou lidas de arquivos externos (atributo file)

Tarefas (mais de 130) - usadas dentro dos alvos.<javac>, <jar>, <java>, <copy>, <mkdir>, ...

Buildfile

Page 34: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

34argo

navis

.com

.br

<?xml version="1.0" encoding="iso-8859-1" ?><!-- Compila diversos arquivos .java -->

<project default="compile" basedir="."> <property name="src.dir" value="src" /><property name="build.dir" value="classes" /><target name="init">

<mkdir dir="${build.dir}" /></target><target name="clean">

<delete dir="${build.dir}" /></target><target name="compile" depends="init"

description="Compila os arquivos-fonte"><javac srcdir="${src.dir}" destdir="${build.dir}">

<classpath><pathelement location="${build.dir}" />

</classpath></javac>

</target></project>

Tarefas

Alvos

Propriedades

Buildfile (2)

Elementos embutidos nas tarefas

Page 35: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

35argo

navis

.com

.br

ExemploExecutando buildfile da página anteriorC:\usr\palestra\antdemo> antBuildfile: build.xml

init:[mkdir] Created dir: C:\usr\palestra\antdemo\classes

compile:[javac] Compiling 2 source files to C:\usr\palestra\antdemo\classes

BUILD SUCCESSFULTotal time: 4 secondsC:\usr\palestra\antdemo> ant cleanBuildfile: build.xml

clean:[delete] Deleting dir:C:\usr\palestra\antdemo\classes

BUILD SUCCESSFULTotal time: 2 secondsC:\usr\palestra\antdemo>

build.xmlsrc

argonavisutil

Tiracentos.javaTiracentosTest.java

classesargonavis

utilTiracentos.classTiracentosTest.class

ANTES de 'ant'DEPOIS de 'ant clean'

DEPOIS de 'ant' ou 'ant compile'build.xmlsrc

argonavisutil

Tiracentos.javaTiracentosTest.java

Page 36: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

36argo

navis

.com

.br

<target name="init" /><target name="clean" /><target name="compile" depends="init"/><target name="javadoc" depends="compile"/><target name="build" depends="compile"/><target name="test" depends="build"/><target name="deploy" depends="build"/><target name="email" depends="archive"/><target name="archive"

depends="build, javadoc"/><target name="re-deploy"

depends="clean, deploy"/>

DependênciasFazem com que a chamada de um alvo cause a chamada de outros alvos, em determinada ordem

Promovem reuso de códigoinit

compile

build

deploy

test

javadoc

clean

re-deploy

archive

email1

221

Page 37: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

37argo

navis

.com

.br

Tarefas condicionadasAlgumas tarefas só são executadas dentro de determinadas condições

<mkdir> só cria o diretório se este não existir<delete> só apaga o que existe (não faz nada se arquivo ou diretório não existir)<javac> compila apenas os arquivos *.java que foram modificados desde a última compilação

Comportamento condicional do <javac> depende da estrutura de pacotes

É preciso que a estrutura de diretórios dos fontes (diretório src/) reflita a estrutura de pacotesEx: se Conta.java declara pertencer a pacote banco, deve estar em diretório banco dentro de src/

Page 38: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

38argo

navis

.com

.br

O que se pode fazer com Ant?Compilar.

<javac>, <csc>Gerar documentação

<javadoc>, <junitreport>,<style>, <stylebook>

Gerar código (XDoclet)<ejbdoclet>, <webdoclet>

Executar programas<java>, <apply>, <exec><ant>, <sql>

Empacotar e comprimir<jar>, <zip>, <tar>, <war>, <ear>, <cab>

Expandir, copiar, instalar<copy>, <delete>, <mkdir>,<unjar>, <unwar>, <unzip>

Acesso remoto<ftp>, <telnet>, <cvs>,<mail>, <mimemail>

Montar componentes<ejbc>, <ejb-jar>, <rmic>

Testar unidades de código<junit>

Executar roteiros e sons<script>, <sound>

Criar novas tarefas<taskdef>

Page 39: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

39argo

navis

.com

.br

Tarefas úteis (1)<javac>: Chama o compilador Java

<jar>: Monta um JAR

<javac srcdir="dirfontes" destdir="dirbuild" ><classpath>

<pathelement path="arquivo.jar" /><pathelement path="/arquivos" />

</classpath><classpath idref="extra" />

</javac>

<jar destfile="bin/executavel.jar"><manifest>

<attribute name="Main-class" value="exemplo.main.Exec">

</manifest><fileset dir="${build.dir}"/>

</jar>

Page 40: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

40argo

navis

.com

.br

A tarefa <javac>

É a tarefa mais importante de um processo típico de montagem

Oferece uma fachada sobre compiladores JavaSuporta outros compiladores (por exemplo, o IBM Jikes)

Opções de linha de comando do compilador tornam-se atributos ou subelementos de <javac>javac -classpath abc.jar;c:\exemplos -d build *.java

é o mesmo que<javac srcdir="." destdir="build">

<classpath path="abc.jar;c:\exemplos" /></javac>

Page 41: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

41argo

navis

.com

.br

<javac> define FileSets

O FileSet é um tipo de dados especial que representa uma árvore de arquivos e diretórios

A tarefa <javac> é um tipo de FileSetOutra forma de escrever <javac> (usando path-like structures) para indicar o caminho de fontes (src) e classes (classpath)<javac destdir="${classes.dir}">

<src path="${gen.src.dir}"><patternset refid="default.excludes" />

</src><src path="${src.dir}" /><classpath refid="${app.path}" />

</javac>

Page 42: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

42argo

navis

.com

.br

Tipos de dados (1)

<fileset>: árvore de arquivos e diretóriosConteúdo do conjunto pode ser reduzido utilizando elementos <include> e <exclude>Usando dentro de tarefas que manipulam com arquivos e diretórios como <copy>, <zip>, etc.

<copy todir="${build.dir}/META-INF"><fileset dir="${xml.dir}" includes="ejb-jar.xml"/><fileset dir="${xml.dir}/jboss">

<include name="*.xml" /><exclude name="*-orig.xml" />

</fileset></copy>

Árvore a ser copiada para ${build.dir}/META-INF consiste de•O arquivo ejb-jar.xml localizado em ${xml.dir}•Todos os arquivos .xml de ${xml.dir}/jboss com exceção dos arquivos

terminados em -orig.xml

Page 43: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

43argo

navis

.com

.br

Tarefas úteis (2)

<mkdir>: cria diretórios

<copy>: copia arquivos

<delete>: apaga arquivos<delete file="arquivo" /><delete dir="diretorio"/>

<copy todir="dir" file="arquivo" />

<copy todir="dir"><fileset dir="fonte" includes="*.txt" />

</copy>

<mkdir dir="diretorio" />

Page 44: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

44argo

navis

.com

.br

Tipos de dados (2)<patternset>: coleção de padrões de busca

<path>: coleção de caminhos (path-like structures)Associa um ID a grupo de arquivos ou caminhos

<path id="server.path"><pathelement path="${j2ee.home}/lib/locale" /><fileset dir="${j2ee.home}/lib">

<patternset refid="project.jars" /></fileset>

</path><target name="compile" depends="init">

<javac destdir="${build.dir}" srcdir="${src.dir}"> <classpath refid="server.path" />

</javac></target>

<patternset id="project.jars" > <include name="**/*.jar"/> <exclude name="**/*-test.jar"/>

</patternset>

Padrões podem ser reusados e são identificados pelo ID

Page 45: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

45argo

navis

.com

.br

Tipos de dados (5): filtros<filter> e <filterset>: Permite a substituição de padrões em arquivos durante a execução de uma tarefa

Caractere default: @Exemplo: a cópia abaixo irá substituir todas as ocorrências de @javahome@ por c:\j2sdk1.4 nos arquivos copiados

Pares token=valor podem ser carregados de arquivo:<filterset>

<filtersfile file="build.properties" /></filterset>

<copy todir="${dest.dir}"> <fileset dir="${src.dir}"/><filterset>

<filter token="javahome" value="c:\j2sdk1.4"/></filterset>

</copy>

Substituição sem tokens pode ser feita com <replacetoken>

Page 46: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

46argo

navis

.com

.br

Tarefas úteis (3)<javadoc>: Gera documentação do código-fonte.

Exemplo: alvo generate-docs abaixo gera documentação excluindo classes que terminam em 'Test.java'<target name="generate-docs">

<mkdir dir="docs/api"/><copy todir="tmp">

<fileset dir="${src.dir}"><include name="**/*.java" /><exclude name="**/*Test.java" />

</fileset></copy>

<javadoc destdir="docs/api" packagenames="argonavis.*" sourcepath="tmp" />

<delete dir="tmp" /></target>

Procurar em todos os subdiretórios

Onde achar as fontes

Copiar de ${src.dir}

Page 47: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

47argo

navis

.com

.br

Propriedades

Todas podem ser lidas com ${nome}Nativas do Ant

ant.file - caminho completo do build.xmlant.home - diretório de instalação do antant.java.version - versão do Java usadoant.project.name - nome do projetoant.version - versão do Antbasedir - diretório onde está o build.xml

Nativas do Java ou do JVMQualquer propriedade nativa do Java pode ser lida da mesma forma

Page 48: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

48argo

navis

.com

.br

Como criar propriedades

Podem ser definidas com <property><property name="app.nome" value="jmovie" />

Podem ser carregadas de um arquivo<property file="c:/conf/arquivo.properties" />

Podem ser passadas na linha de comandoc:\> ant -Dautor=Wilde

Para recuperar o valor, usa-se ${nome}<jar destfile="${app.nome}-${app.ver}.jar"/><echo message="O autor é ${autor}" /><mkdir dir="build${codigo}" />

app.ver=1.0docs.dir=c:\\docs\\codigo=15323 arquivo.properties

Page 49: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

49argo

navis

.com

.br

Propriedades especiais<tstamp>: Grava um instante

A hora e data podem ser recuperados como propriedades ${TSTAMP} hhmm 1345${DSTAMP} aaaammdd 20020525${TODAY} dia mes ano 25 May 2002

Novas propriedades podem ser definidas, locale, etc.Uso típico: <tstamp/>

<property environment="env">: Propriedade de onde se pode ler variáveis de ambiente do sistema

Dependende de plataforma<target name="init">

<property environment="env"/> <property name="j2ee.home"

value="env.J2EE_HOME" /> </target>

Page 50: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

50argo

navis

.com

.br

Propriedades que apontam para caminhos

Se uma propriedade representa um caminho no sistema de arquivos, ela pode ser definida com name/value, mas o valor será sempre um caminho relativoUsando name/location pode-se definir valores absolutos<property name="build.dir"

location="classes" />guardará o caminho completo ao diretório local build

Page 51: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

51argo

navis

.com

.br

Propriedades condicionais

<available> irá definir uma propriedade (com valor true) se um determinado recurso existir

<available property="arquivo.existe"file="importante.txt"type="file" />

A existência ou não de uma propriedade pode ser usada em blocos condicionais

<target name="nome" if="arquivo.existe">...</target>

Page 52: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

52argo

navis

.com

.br

Propriedades condicionais

<uptodate> seta uma propriedade se os arquivos de uma fonte estiverem em dia com os arquivos de um destino, identificado por um <mapper>

A propriedade pode ser usada para realizar controle condicional

Exemplo de uso<uptodate property="tests.unnecessary">

<srcfiles dir="src" includes="**/*.java" />

<mapper type="glob" from="*.java" to="*.class" />

</uptodate>

Page 53: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

53argo

navis

.com

.br

<input>

Permite feedback do usuario em tempo real

<input message="Continua (s/n)?" validargs="s,n" addproperty="continua" />

<condition property="abortar"> <equals arg1="n" arg2="${continua}"/>

</condition>

<fail if="abortar">Processo encerrado pelo usuario.

</fail>

Page 54: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

54argo

navis

.com

.br

Tarefas úteis (4): J2EE<ear destfile="app.ear" appxml="application.xml">

<fileset dir="${build}" includes="*.jar,*.war"/></ear>

<ejbjar srcdir="${build}" descriptordir="${xml.dir}" ... ><jboss destdir="${deployjars.dir}" />

</ejbjar>

<war destfile="bookstore.war" webxml="meta/metainf.xml"><fileset dir="${build}/${bookstore2}" >

<include name="*.jsp" /><exclude name="*.txt" />

</fileset><classes dir="${build}" >

<include name="database/*.class" /></classes><lib dir="bibliotecas" /><webinf dir="etc" />

</war>

Fileset para raiz do WAR

Fileset paraWEB-INF/classes

Fileset para WEB-INF/lib

Fileset para WEB-INF/

WEB-INF/web.xml

Há suporte aos principais servidores de aplicação

Page 55: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

55argo

navis

.com

.br

<ejbdoclet> e <webdoclet>*: Geram códigoRequer JAR de xdoclet.sourceforge.netIdeal para geração automática de arquivos de configuração(web.xml, ejb-jar.xml, application.xml, taglibs, struts-config, etc.) e código-fonte (beans, value-objects)

<ejbdoclet sourcepath="src" destdir="${build.dir}"classpathref="xdoclet.path" ejbspec="2.0">

<fileset dir="src"><include name="**/*Bean.java" />

</fileset><remoteinterface/><homeinterface/><utilobject/><entitypk/> <entitycmp/> <deploymentdescriptor destdir="${dd.dir}"/><jboss datasource="java:/OracleDS" />

</ejbdoclet>

Detalhes da configuração do componente estão nos comentários de JavaDocs do código-fonte dos arquivos envolvidos e arquivos de template

Tarefas úteis (5): extensão

* Nomes convencionais criados a partir de tarefa externa

Page 56: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

56argo

navis

.com

.br

Tarefas úteis (6): execução

<java>: executa o interpretador Java

<exec>: executa um comando do sistema

<apply>: semelhante a <exec> mas usado em executáveis que operam sobre outros arquivos

<target name="orbd"><exec executable="${java.home}\bin\orbd">

<arg line="-ORBInitialHost ${nameserver.host}"/></exec>

</target>

<target name="runrmiclient"><java classname="hello.rmi.HelloClient" fork="true">

<jvmarg value="-Djava.security.policy=rmi.policy"/><arg name="host" value="${remote.host}" /><classpath refid="app.path" />

</java></target>

Page 57: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

57argo

navis

.com

.br

Tarefas úteis (7): rede

<ftp>: Realiza a comunicação com um servidor FTP remoto para upload ou download de arquivos

Tarefa opcional que requer NetComponents.jar(http://www.savarese.org)

<target name="remote.jboss.deploy" depends="dist"><ftp server="${ftp.host}" port="${ftp.port}"

remotedir="/jboss/server/default/deploy" userid="admin" password="jboss"depends="yes" binary="yes">

<fileset dir="${basedir}"><include name="*.war"/><include name="*.ear"/><include name="*.jar"/>

</fileset></ftp>

</target>

Page 58: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

58argo

navis

.com

.br

Tarefas úteis (8): XSLT<style>: Transforma documentos XML em outros formatos usando folha de estilos XSLT (nativa)

Usa TrAX (default), Xalan ou outro transformador XSL

Elemento <param> passa valores para elementos <xsl:param> da folha de estilos<style in="cartao.xml"

out="cartao.html" style="cartao2html.xsl">

<param name="docsdir" expression="/cartoes"/>

</style> (...)<xsl:param name="docsdir"/>(...)<xsl:valueof select="$docsdir"/>(...)cartao2html.xsl

<style basedir="xmldocs" destdir="htmldocs" style="xmltohtml.xsl" />

build.xml

Page 59: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

59argo

navis

.com

.br

Tarefas úteis (9): JDBC<sql>: Comunica-se com banco de dados através de um driver JDBC

<property name="jdbc.url" value="jdbc:cloudscape:rmi://server:1099/Cloud" />

<target name="populate.table"><sql driver="COM.cloudscape.core.RmiJdbcDriver"

url="${jdbc.url}" userid="helder" password="helder" onerror="continue">

<transaction src="droptable.sql" /><transaction src="create.sql" /><transaction src="populate.sql" /><classpath refid="jdbc.driver.path" />

</sql></target>

Page 60: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

60argo

navis

.com

.br

Tarefas úteis (10): chamadas<ant>: chama alvo de subprojeto (buildfile externo)

<antcall>: chama alvo local

<target name="run-sub"><ant dir="subproj" />

</target>

<target name="run-sub"><ant dir="subproj" >

<property name="versao"value="1.0" />

</ant></target>

Define propriedade que será lida no outro build.xml

Chama alvo default de build.xmllocalizado no subdiretório subproj/

<target name="fazer-isto"><antcall target="fazer">

<param name="oque" value="isto" />

</antcall></target>

<target name="fazer" if="oque"><tarefa atributo="${oque}" />

</target>

<target name="fazer-aquilo"><antcall target="fazer">

<param name="oque" value="aquilo" />

</antcall></target>

Template!

Page 61: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

61argo

navis

.com

.br

Efeitos sonoros

<sound>: define um par de arquivos de som para soar no sucesso ou falha de um projeto

Tarefa opcional que requer Java Media FrameworkExemplo:

No exemplo abaixo, o som festa.wav será tocado quando o build terminar sem erros fatais. vaia.wavtocará se houver algum erro que interrompa o processo:

<target name="init"><sound>

<success source="C:/Media/festa.wav"/><fail source="C:/Media/vaia.wav"/>

</sound></target>

Page 62: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

62argo

navis

.com

.br

Extensão usando XMLComo o buildfile é um arquivo XML, pode-se incluir trechos de XML externos através do uso de entidades externas

<property file="sound.properties" /><sound>

<success source="${success.sound}"/><fail source="${fail.sound}"/>

</sound>

<property file="sound.properties" /><sound>

<success source="${success.sound}"/><fail source="${fail.sound}"/>

</sound>

<?xml version="1.0" encoding="iso-8859-1" ?><!DOCTYPE project [

<!ENTITY sound SYSTEM "sound.xml">]><project default="dtd">

<description>Gera um DTD para o Ant</description><target name="init">

&sound;</target><target name="dtd" depends="init">

<antstructure output="ant.dtd" /></target>

</project>

<?xml version="1.0" encoding="iso-8859-1" ?><!DOCTYPE project [

<!ENTITY sound SYSTEM "sound.xml">]><project default="dtd">

<description>Gera um DTD para o Ant</description><target name="init">

&sound;</target><target name="dtd" depends="init">

<antstructure output="ant.dtd" /></target>

</project>

sound.xml

Page 63: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

63argo

navis

.com

.br

Ant + JUnit

Ant: ferramenta para automatizar processos de construção de aplicações JavaPode-se executar todos os testes após a integração com um único comando:

ant roda-testesCom as tarefas <junit> e <junitreport> é possível

executar todos os testesgerar um relatório simples ou detalhado, em diversos formatos (XML, HTML, etc.)executar testes de integração

São tarefas opcionais. É preciso ter no $ANT_HOME/liboptional.jar (distribuído com Ant)junit.jar (distribuído com JUnit)

Page 64: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

64argo

navis

.com

.br

Exemplo: <junit><target name="test" depends="build">

<junit printsummary="true" dir="${build.dir}" fork="true">

<formatter type="plain" usefile="false" /><classpath path="${build.dir}" /<test name="argonavis.dtd.AllTests" />

</junit></target>

<target name="batchtest" depends="build" ><junit dir="${build.dir}" fork="true">

<formatter type="xml" usefile="true" /><classpath path="${build.dir}" /><batchtest todir="${test.report.dir}">

<fileset dir="${src.dir}"><include name="**/*Test.java" /><exclude name="**/AllTests.java" />

</fileset></batchtest>

</junit></target>

Gera arquivo XMLInclui todos os arquivos que

terminam em Test.java

Formata os dados na tela (plain)Roda apenas arquivo AllTests

Page 65: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

65argo

navis

.com

.br

<junitreport>

Gera um relatório detalhado (estilo JavaDoc) de todos os testes, sucessos, falhas, exceções, tempo, ...

<target name="test-report" depends="batchtest" ><junitreport todir="${test.report.dir}">

<fileset dir="${test.report.dir}"><include name="TEST-*.xml" />

</fileset><report todir="${test.report.dir}/html"

format="frames" /></junitreport>

</target>

Usa arquivos XMLgerados por

<formatter>

Page 66: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

66argo

navis

.com

.br

Integração com outras aplicaçõesAnt provoca vários eventos que podem ser capturados por outras aplicações

Útil para implementar integração, enviar notificações por email, gravar logs, etc.

EventosBuild iniciou/terminouAlvo iniciou/terminouTarefa iniciou/terminouMensagens logadas

Vários listeners e loggers pré-definidosPode-se usar ou estender classe existente. Para gravar processo (build) em XML:

> ant -listener org.apache.tools.ant.XmlLogger

Page 67: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

67argo

navis

.com

.br

Integração com editores e IDEsProdutos que integram com Ant e oferecem interface gráfica e eventos para buildfiles:

Antidote: GUI para Ant (do projeto Jakarta)http://cvs.apache.org/viewcvs/jakarta-ant-antidote/

JBuilder (AntRunner plug-in)http://www.dieter-bogdoll.de/java/AntRunner/

NetBeans e Forté for Javahttp://ant.netbeans.org/

Eclipsehttp://eclipse.org

JEdit (AntFarm plug-in)http://www.jedit.org

Jext (AntWork plug-in)ftp://jext.sourceforge.net/pub/jext/plugins/AntWork.zip

Page 68: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

68argo

navis

.com

.br

Integração com o JEdit

Tela do AntFarm mostra alvos do Ant.Pode-se clicar sobre o alvo para executá-lo

Resultados são mostrados no Console do JEdit

Page 69: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

69argo

navis

.com

.br

Como gerenciar projetos com o Ant

Crie um diretório para armazenar seu projeto. Guarde na sua raiz o seu build.xml

Use um arquivo build.properties para definir propriedades exclusivas do seu projeto (assim você consegue reutilizar o mesmo build.xml em outros projetos). Importe-o com<property file="build.properties" />

Dentro desse diretório, crie alguns subdiretóriossrc/ Para armazenar o código-fontelib/ Opcional. Para guardar os JARs de APIs usadasdoc/ Opcional. Para guardar a documentação geradaetc/ Opcional. Para arquivos de configuração se houverweb/ Em projetos Web, para raiz de documentos do site

O seu Ant script deve ainda criar durante a execuçãobuild/ Ou classes/. Onde estará o código compiladodist/ Ou jars/ ou release/. Onde estarão JARs criados

Page 70: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

70argo

navis

.com

.br

Alvos básicos do build.xml

Você também deve padronizar os nomes dos alvos dos seus build.xml. Alguns alvos típicos são

init Para criar dietórios, inicializar o ambiente, etc.clean Para fazer a faxina, remover diretórios gerados, etc.compile Para compilarbuild Para construir a aplicação, integrar, criar JARsrun Para executar um cliente da aplicaçãotest Para executar os testes da aplicaçãodeploy Para implantar componentes Web e EJB

Você pode usar outros nomes, mas mantenha um padrão

Page 71: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

71argo

navis

.com

.br

<project default="compile" name="MiniEd"><property file="build.properties"/><target name="init"><mkdir dir="${build.dir}"/><mkdir dir="${dist.dir}"/>

</target><target name="clean"> ... </target><target name="compile"

depends="init"> ... </target><target name="build"

depends="compile">...</target><target name="javadoc"

depends="build"> ... </target><target name="run"

depends="build"> ... </target></project>

# Nome da aplicaçãoapp.name=minied# Nomes dos diretóriossrc.dir=srcdocs.dir=docsbuild.dir=classesdist.dir=jars# Nome da classe executávelapp.main.class=com.javamagazine.minied.MiniEditorroot.package=com

Exemplo de projeto

Estrutura dosarquivos (antes

de executar o Ant)

build.properties

build.xml

Page 72: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

72argo

navis

.com

.br

Buildfile: aplicação gráfica executável<project default="compile" name="MiniEd">

<property file="build.properties"/>

<target name="compile" depends="init"><javac destdir="classes" srcdir="src">

<classpath><pathelement location="classes"/>

</classpath></javac>

</target>

<target name="build" depends="compile"><jar destfile="release/${app.name}.jar">

<manifest><attribute name="Main-class" value="${app.main.class}" />

</manifest><fileset dir="classes"/>

</jar></target>

<target name="run" depends="build"><java jar="release/${app.name}.jar" fork="true" />

</target>

</project> # Nome da aplicação – este nome será usado para criar o JARapp.name=minied# Nome da classe executávelapp.main.class=com.javamagazine.minied.MiniEditor

Definindo o JAR com atributo Main-class para

torná-lo executável

Page 73: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

73argo

navis

.com

.br

Buildfile: aplicação RMI-IIOP<project name="Aplicação RMI" default="compile">

<target name="compile" depends="init"> <!-- Vários <target> omitidos --><javac destdir="classes" srcdir="src" >

<classpath refid="app.path" /></javac>

</target><target name="buildrmi" depends="compile">

<rmic idl="true" iiop="true" base="classes"><include name="**/rmiop/**Impl.class" /> <include name="**/portable/**Impl.class" />

</rmic></target><target name="runserver" depends="buildrmi">

<java classname="hello.rmiop.HelloServer" fork="true"><jvmarg value="-Djava.rmi.server.codebase=${codebase}"/><jvmarg value="-Djava.security.policy=${lib.dir}/rmi.policy"/><jvmarg value="-Djava.naming.factory.initial=..."/><jvmarg value="-Djava.naming.provider.url=iiop://${host}:1900"/><classpath refid="app.path" />

</java></target><target name="orbd">

<exec executable="${java.home}\bin\orbd"><arg line="-ORBInitialPort 1900 -ORBInitialHost ${host}"/>

</exec></target>

</project>

Page 74: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

74argo

navis

.com

.br

Buildfile: aplicação Web<project default="deploy" name="Aplicação Web">

<property file="build.properties" /> <!-- init e clean omitidos -->

<target name="compile" depends="init"><javac srcdir="src" destdir="classes">

<classpath path="${servlet.jar}" /></javac>

</target>

<target name="war" depends="compile"><war warfile="release/${context}.war" webxml="etc/web.xml">

<fileset dir="web" /><classes dir="classes" />

</war></target>

<target name="deploy" depends="war"><copy todir="${deploy.dir}">

<fileset dir="release"><include name="*.war" />

</fileset></copy>

</target>

</project>

# Localizacao do Servidortomcat.home=/tomcat-4.0

# Altere para informar dir de instalacaodeploy.dir=${tomcat.home}/webapps

# Coloque aqui nome do contextocontext=forum

# JAR com Servlet APIservlet.jar=${tomcat.home}/common/lib/servlet.jar

build.properties

build.xml

Page 75: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

75argo

navis

.com

.br

Buildfile: aplicação EJB<project name="Aplicação EJB" default="deploy">

<property file="build.properties" />

<!-- elementos <path> e <target> init, compile, clean omitidos -->

<target name="build" depends="compile"><copy todir="classes/META-INF">

<fileset dir="etc" includes="ejb-jar.xml"/></copy><jar jarfile="release/${app.name}.jar">

<fileset dir="classes" /></jar>

</target>

<target name="deploy" depends="build"><copy todir="${deploy.dir}" file="release/${app.name}.jar" />

</target>

<target name="undeploy" depends="build"><delete file="${deploy.dir}/${app.name}.jar" />

</target>

</project> # Localizacao do Servidorjboss.home=/jboss-3.0.0

# Altere para informar dir de instalacaodeploy.dir=${jboss.home}/server/default/deploy

# Coloque aqui nome da aplicaçãoapp.name=forumejb

build.properties

build.xml

Page 76: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

76argo

navis

.com

.br

Buildfile: transformação XSL<project name="foptask-example" default="pdf">

<target name="setup" depends="check"><taskdef name="fop" classname="argonavis.pdf.FopTask">

<classpath> ... </classpath></taskdef>

</target>

<target name="many2fo" depends="init"><style in="template.xml" out="all.xml" style="many2one.xsl">

<param name="docsdir" expression="dados"/></style><style in="all.xml" out="all.fo"

extension=".fo" style="many2fo.xsl"/></target>

<target name="many2pdf" depends="many2fo"><fop in="all.fo" out="all.pdf" />

</target>

<target name="html" depends="init"><style basedir="dados" destdir="html"

extension=".html" style="toHtml.xsl" /></target>

</project>

Converte vários XML em HTML

Mescla vários XML em um único XML maior e converte em XSL-FO

Converte XSL-FO em PDF

Page 77: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

77argo

navis

.com

.br

Ant programável

Há duas formas de estender o Ant com novas funçõesImplementar roteiros usando JavaScriptCriar novas tarefas reutilizáveis

A tarefa <script> permite embutir JavaScript em um buildfile. Pode-se

Realizar operações aritméticas e booleanasUtilizar estruturas como if/else, for, foreach e whileManipular com os elementos do buildfile usando DOM

A tarefa <taskdef> permite definir novas tarefasTarefa deve ser implementada em Java e estender TaskMétodo execute() contém código de ação da tarefaCada atributo corresponde a um método setXXX()

Page 78: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

78argo

navis

.com

.br

Exemplo de scriptCria 10 diretórios pasta1, pasta2, etc. em pastas/

<project name="scriptdemo" default="makedirs" >

<property name="result.dir" value="pastas" />

<target name="setup-makedirs"><mkdir dir="${result.dir}" /><script language="javascript"><![CDATA[for (i = 0; i < 10; i++) {criadir = scriptdemo.createTask("mkdir");// Obter propriedade ${result.dir} deste projetoroot = scriptdemo.getProperty("result.dir");// Definir diretorio a criarcriadir.setDir(new

Packages.java.io.File(root+"/pasta"+(i+1)));// Executa tarefa mkdir (todo Task tem um metodo execute)criadir.execute();

}]]></script>

</target>

<target name="makedirs" depends="setup-makedirs" />

</project>

Obtém referência para objeto que implementa tarefa mkdir

Page 79: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

79argo

navis

.com

.br

Exemplo de definição de tarefas (1)

import org.apache.tools.ant.*;

public class ChangeCaseTask extends Task {

public static final int UPPERCASE = 1;private String message;private int strCase = 0;

public void execute() {log( getMessage() );

}public void setMessage(String message) {

this.message = message;}public void setCase(String strCase) {

if (strCase.toLowerCase().equals("uppercase"))this.strCase = UPPERCASE;

else if (strCase.toLowerCase().equals("lowercase")) this.strCase = -UPPERCASE;

}public String getMessage() {

switch(strCase) {case UPPERCASE: return message.toUpperCase();case -UPPERCASE: return message.toLowerCase();default: return message;

}}

}

<target name="define-task" depends="init"><taskdef name="changecase"

classname="ChangeCaseTask"><classpath>

<pathelement location="tasks.jar" /></classpath>

</taskdef></target>

<target name="run-task" depends="define-task"><changecase message="Mensagem simples" /><changecase message="Mensagem em caixa-alta"

case="uppercase" /><changecase message="Mensagem em caixa-baixa"

case="lowercase" /></target>

Trecho do build.xml usando tarefa<changecase>

Cada atributo é definido em um método setAtributo(String)

Método execute() chama log(), que imprime resultado na saída do Ant

(Exceções foram ignoradas por falta de espaço)

Page 80: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

80argo

navis

.com

.br

ConclusõesAnt é uma ferramenta indispensável em qualquer projeto de desenvolvimento Java

Permite automatizar todo o desenvolvimentoFacilita a montagem da aplicação por outras pessoasAjuda em diversas tarefas essenciais do desenvolvimento como compilar, rodar, testar, gerar JavaDocs, etc.Independe de um IDE comercial (mas pode ser facilmente integrado a um)

Use o Ant em todos os seus projetosCrie sempre um projeto e um buildfile, por mais simples que seja a sua aplicaçãoEscreva buildfiles que possam ser reutilizadosDesenvolva o hábito de sempre usar o Ant

Page 81: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

81argo

navis

.com

.br

Fontes[1] Richard Hightower e Nicholas Lesiecki. Java Tools for eXtreme Programming.

Wiley, 2002. Explora Ant e outras ferramentas em ambiente XP.

[3] Apache Ant User's Manual. Ó tima documentação repleta de exemplos.

[3] Steve Lougran. Ant In Anger - Using Ant in a Production Development System.(Ant docs) Ó timo artigo com boas dicas para organizar um projeto mantido com Ant.

[4] Martin Fowler, Matthew Foemmel. Continuous Integration. http://www.martinfowler.com/articles/continuousIntegration.html. Ó timo artigo sobre integração contínua e o CruiseControl.

[5] Erik Hatcher. Java Development with Ant. Manning Publications. August 2002. Explora os recursos básicos e avançados do Ant, sua integração com JUnit e uso com ferramentas de integração contínua como AntHill e CruiseControl.

[6] Jesse Tilly e Erik Burke. Ant: The Definitive Guide. O'Reilly and Associates. May 2002. Contém referência completa e ótimo tutorial sobre recursos avançados como controle dos eventos do Ant e criação de novas tarefas.

[7] Karl Fogel. Open Source Development with CVS. Coriolis Press. http://cvsbook.red-bean.com/.

Page 82: Abaporu @ JavaONE 2003 · Abaporu @ JavaONE 2003 Helder da Rocha (helder@acm.org) argonavis.com.br Como construir um ... de trabalho e menu de aplicações Nos sistemas Unix, o JEdit

Baseado no Curso J820Produtividade e Qualidade em Java:

Ferramentas e MetodologiasRevisão 1.1

e artigo publicado na Java Magazine, no. 3

© 2002, 2003, Helder da Rocha([email protected])

argonavis.com.br