SlideShare ist ein Scribd-Unternehmen logo
1 von 59
Downloaden Sie, um offline zu lesen
J820

Introdução ao

Apache Ant
Helder da Rocha (helder@acm.org)

argonavis.com.br
O que é Ant?
Uma ferramenta para construção de aplicações
Implementada em Java
Baseada em roteiros XML
Extensível (via scripts ou classes)
'padrão' do mercado
Open Source (Grupo Apache, Projeto Jakarta)

argonavis.com.br

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

Onde encontrar: http://ant.apache.org
2
Para que serve?
Para montar praticamente qualquer aplicação Java
que consista de mais que meia dúzia de classes;
Aplicações

argonavis.com.br

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

Para automatizar processos frequentes
Javadoc, XSLT, implantação de serviços Web e J2EE
(deployment), CVS, criação de JARs, testes, FTP, email
3
Como funciona?
Ant executa roteiros escritos em XML: 'buildfiles'
Cada projeto do Ant possui um buildfile
Subprojetos podem ter, opcionalmente, buildfiles
adicionais chamados durante a execução do primeiro

argonavis.com.br

Cada projeto possui uma coleção de alvos
Cada alvo consiste de uma seqüência de tarefas
Exemplos de execução
ant
Procura build.xml no diretório atual e roda alvo default
ant -buildfile outro.xml
Executa alvo default de arquivo outro.xml
ant compilar
Roda alvo 'compilar' e possíveis dependências em build.xml
4
Como funciona (2)
Ant

<xml>
<xml>
<xml>
<xml>

build.xml

subproj

<xdoclet>
<xml>
<xml>

ejb-jar.xml

build.xml

*.java

<ejb-jar>

<javac>

argonavis.com.br

CVS

<javadoc>

<javac>

<ant>

<xml>
<xml>

*.class

<cvs>

*.java

*.class

*.html

<junit>
Testes

<jar update="true">

docs.zip

ejb-jar.jar

<copy>

<mimemail>

<ftp>
deploy

5
Buildfile

argonavis.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üência
Pode-se estabelecer dependências entre alvos
Deve 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>, ...

6
Buildfile (2)
<?xml version="1.0" encoding="iso-8859-1" ?>
<!-- Compila diversos arquivos .java -->
Propriedades

argonavis.com.br

<project default="compile" basedir=".">
<property name="src.dir" value="src" />
<property name="build.dir" value="classes" />
<target name="init">
<mkdir dir="${build.dir}" />
</target>
Alvos
<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>
Tarefas
<pathelement location="${build.dir}" />
</classpath>
</javac>
Elementos embutidos nas tarefas
</target>
</project>

7
Exemplo
Executando buildfile da página anterior
C:usrpalestraantdemo> ant
Buildfile: build.xml
init:
[mkdir] Created dir:
C:usrpalestraantdemoclasses
compile:
[javac] Compiling 2 source files to
C:usrpalestraantdemoclasses

argonavis.com.br

BUILD SUCCESSFUL
Total time: 4 seconds
C:usrpalestraantdemo> ant clean
Buildfile: build.xml
clean:
[delete] Deleting dir:
C:usrpalestraantdemoclasses
BUILD SUCCESSFUL
Total time: 2 seconds
C:usrpalestraantdemo>

ANTES de 'ant'
DEPOIS de 'ant clean'
build.xml
src
argonavis
util
Tiracentos.java
TiracentosTest.java

DEPOIS de 'ant' ou 'ant compile'
build.xml
src
argonavis
util
Tiracentos.java
TiracentosTest.java
classes
argonavis
util
Tiracentos.class
TiracentosTest.class

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

argonavis.com.br

Promovem reuso de código
<target
<target
<target
<target
<target
<target
<target
<target
<target

init

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

compile

javadoc

build

test

deploy
1

archive

2

2

re-deploy
1

email

clean

9
Tarefas condicionadas
Algumas 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

argonavis.com.br

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 pacotes
Ex: se Conta.java declara pertencer a pacote banco,
deve estar em diretório banco dentro de src/
10
O que se pode fazer com Ant?
Compilar.
<javac>, <csc>

Gerar documentação
<javadoc>, <junitreport>,
<style>, <stylebook>

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

argonavis.com.br

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>

11
Tarefas úteis (1)
<javac>: Chama o compilador Java
<javac srcdir="dirfontes" destdir="dirbuild" >
<classpath>
<pathelement path="arquivo.jar" />
<pathelement path="/arquivos" />
</classpath>
<classpath idref="extra" />
</javac>

argonavis.com.br

<jar>: Monta um JAR
<jar destfile="bin/executavel.jar">
<manifest>
<attribute name="Main-class"
value="exemplo.main.Exec">
</manifest>
<fileset dir="${build.dir}"/>
</jar>

12
A tarefa <javac>
É a tarefa mais importante de um processo típico de
montagem
Oferece uma fachada sobre compiladores Java
Suporta 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

argonavis.com.br

é o mesmo que
<javac srcdir="." destdir="build">
<classpath path="abc.jar;c:exemplos" />
</javac>

13
<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 FileSet

argonavis.com.br

Outra 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>

14
Tarefas úteis (2)
<mkdir>: cria diretórios
<mkdir dir="diretorio" />

<copy>: copia arquivos
<copy todir="dir" file="arquivo" />
<copy todir="dir">
<fileset dir="fonte" includes="*.txt" />
</copy>

argonavis.com.br

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

15
Tipos de dados (1)
<fileset>: árvore de arquivos e diretórios

argonavis.com.br

Conteú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

16
FileSets filtrados
Pode-se filtrar os elementos de um FileSet usando
subelementos <include> e <exclude>
Pode-se também usar os atributos includes e excludes

O bloco abaixo inclui apenas os arquivos *.txt diretamente
abaixo de pasta
<fileset dir="pasta">
<include name="*.txt" />
</fileset>

argonavis.com.br

Este outro inclui todos os *.txt em qualquer lugar da árvore
exceto os *-old.txt logo abaixo de pasta
<fileset dir="pasta">
<include name="**/*.txt" />
<exclude name="*-old.txt" />
</fileset>

17
ZipFileSet

argonavis.com.br

Tipo de FileSet
Permite incluir prefixos em arquivos armazenados em
ZIPs (ou JARs)
Prefixos são transformados em diretórios na
descompressão
Exemplo de uso
<jar destfile="arquivo.jar">
<zipfileset dir="dados"
prefix="extra/dados" />
</jar>

18
Tipos de dados (2)
<patternset>: coleção de padrões de busca
<patternset id="project.jars" >
<include name="**/*.jar"/>
<exclude name="**/*-test.jar"/>
</patternset>

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

<path>: coleção de caminhos (path-like structures)

argonavis.com.br

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>

19
Path-like structures
São listas ordenadas de elementos de um caminho do
sistema de arquivos
Exemplo

argonavis.com.br

<classpath>
<pathelement location="lib/arquivo.jar" />
<pathelement location="c:classes" />
<pathelement path="/usr/bin:/usr:/lib" />
</classpath>

O atributo location permite especificar um único
arquivo ou diretório. O atributo path permite
especificar um caminho inteiro
As barras e separadores serão convertidos ao sistema
operacional nativo
20
Paths e FileSets

argonavis.com.br

Paths podem ser compostos de conjuntos de arquivos
usando <fileset>
<path id="app.path">
<fileset dir="app.dir" />
<fileset dir="mais.dir">
<include name="**/*.jar" />
<include name="**/*.zip" />
</fileset>
<pathelement location="c:classes" />
<pathelement path="/usr/bin:/usr:/lib" />
</path>

21
Pattern Sets
São coleções de padrões <include> e <exclude>
Sintaxe

* combina com um ou mais caracteres
? combina com um caractere
**, usado como nome de diretório, combina com todos
os diretórios daquele ponto em diante na árvore
/ ou  no final de um diretório, é equivalente a /**

argonavis.com.br

Pattern sets podem ser definidos em
Atributos includes e excludes de um fileset
Arquivos com um pattern por linha carregados através
de atributos includesfile e excludesfile
Elementos <patternset> identificados por um id
contendo listas de <include> e <exclude>

22
Exemplos de Pattern Sets
<patternset id="docs">
<include name="**/*.htm*" />
<exclude name="~*.htm*" />
</patternset>

argonavis.com.br

<patternset id="webdocs">
<include name="**/*.gif, **/*.jpg"/>
<patternset refid="docs" />
</patternset>

23
Tipos de dados (4): seletores

argonavis.com.br

Permitem a seleção dos elementos de um fileset usando
critérios além dos definidos por <include> e <exclude>
Sete seletores básicos (pode-se criar novos)

<contains> - Seleciona arquivos que contém determinado texto
<date> - Arquivos modificados antes ou depois de certa data
<depend> - Seleciona arquivos cuja data de modificação seja
posterior a arquivos localizados em outro lugar
<depth> - Seleciona arquivos encontrados até certa
profundidade de uma árvore de diretórios
<filename> - Equivalente ao include e exclude
<present> - Seleciona arquivo com base na sua (in)existência
<size> - Seleciona com base no tamanho em bytes

Exemplo: Seleciona arquivos do
diretório "fonte" que também
estão presentes em "destino"

<fileset dir="fonte">
<present targetdir="destino"/>
</fileset>

24
argonavis.com.br

Exemplos com seletores
<copy todir="novos">
<fileset dir="docs">
<not>
<present targetdir="public_html" />
</not>
</fileset>
Seletores podem ser combinados dentro
</copy>
de containers de seletores para realizar
lógica de seleção
<copy todir="novos">
<and>, <or>, <none>, <majority>
<fileset dir="docs">
<and>
<contains text="Revision" />
<not><present targetdir="public_html"/></not>
</and>
</fileset>
</copy>

25
Mapper
<mapper>: altera nomes de arquivos durante cópias ou
transformações (use dentro de <copy>, por exemplo)
Seis tipos: identity, flatten, merge, regexp, glob, package

argonavis.com.br

build.xml
src
argonavis
util
Tiracentos.java
TiracentosTest.java

<mapper
type="package"
from="*.java"
to="*.txt"/>

<mapper
type="flatten" />

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

build.xml
src
argonavis.util.Tiracentos.txt
argonavis.util.TiracentosTest.txt

build.xml
src
Tiracentos.java
TiracentosTest.java

build.xml
src
argonavis
util
Tiracentos.java.bak
TiracentosTest.java.bak

26
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

argonavis.com.br

<copy todir="${dest.dir}">
<fileset dir="${src.dir}"/>
<filterset>
<filter token="javahome" value="c:j2sdk1.4"/>
</filterset>
</copy>

Pares token=valor podem ser carregados de arquivo:
<filterset>
<filtersfile file="build.properties" />
</filterset>

Substituição sem tokens pode ser feita com <replacetoken>
27
Exemplo com Filter Sets
Exemplo com inserção de datas: teste.txt
Data de hoje: @data@ / @hora@

Bulildfile

argonavis.com.br

<tstamp />
<copy todir="gerados">
<fileset dir="testes" includes="teste.txt" />
<filterset>
<filter token="data" value="${DSTAMP}" />
<filter token="hora" value="${TSTAMP}" />
</filterset>
</copy>

Resultado
Data de hoje: 20030528 / 1458

28
FilterChains e FilterReaders

argonavis.com.br

FilterReader é um filtro pré-configurado
FilterChains são grupos ordenados de FilterReaders
executados em conjunto
Usados dentro de <copy>, <move>, <loadfile> e
<loadproperties>
Alguns FilterReaders
<classconstants>, <expandproperties>,
<linecontains>, <prefixlines>, <replacetokens>,
<stripjavacomments>, <striplinebreaks>,
<tabstospaces>

29
Exemplos de FilterChain

argonavis.com.br

<copy todir="novos">
<filterchain>
<stripcomments>
<comment value="#"/>
</stripcomments>
</filterchain>
</copy>
<loadproperties srcfile="Constantes.class">
<filterchain>
<classconstants />
<prefixlines prefix="Constantes." />
</filterchain>
</loadproperties >

30
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'

argonavis.com.br

<target name="generate-docs">
Copiar de ${src.dir}
<mkdir dir="docs/api"/>
<copy todir="tmp">
<fileset dir="${src.dir}">
<include name="**/*.java" />
<exclude name="**/**Test.java" />
</fileset>
Procurar em todos os
</copy>
subdiretórios
<javadoc destdir="docs/api"
packagenames="argonavis.*"
sourcepath="tmp" />
<delete dir="tmp" />
</target>

Onde achar as fontes

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

argonavis.com.br

ant.file - caminho completo do build.xml
ant.home - diretório de instalação do ant
ant.java.version - versão do Java usado
ant.project.name - nome do projeto
ant.version - versão do Ant
basedir - diretório onde está o build.xml

Nativas do Java ou do JVM
Qualquer propriedade nativa do Java pode ser lida da
mesma forma
32
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" />
app.ver=1.0
docs.dir=c:docs
codigo=15323

arquivo.properties

argonavis.com.br

Podem ser passadas na linha de comando
c:> 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}" />

33
Propriedades são imutáveis
Uma vez definida, uma propriedade não muda de valor
O primeiro valor atribuído é sempre usado
Tentativas posteriores de alterar o valor da propriedade
não funcionam

argonavis.com.br

Propriedades passadas em linha de comando são
definidas antes das propriedades dentro do build.xml
ou build.properties

34
Propriedades especiais
<tstamp>: Grava um instante
A hora e data podem ser recuperados como propriedades
${TSTAMP}
${DSTAMP}
${TODAY}

hhmm
aaaammdd
dia mes ano

1345
20020525
25 May 2002

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

argonavis.com.br

<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>

35
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
relativo
Usando name/location pode-se definir valores
absolutos

argonavis.com.br

<property name="build.dir"
location="classes" />

guardará o caminho completo ao diretório local build

36
Propriedades condicionais
<available> irá definir uma propriedade (com valor
true) se um determinado recurso existir
<available property="arquivo.existe"
file="importante.txt"
type="file" />

argonavis.com.br

A existência ou não de uma propriedade pode ser
usada em blocos condicionais
<target name="nome" if="propriedade">
...
</target>
37
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

argonavis.com.br

Exemplo de uso
<uptodate property="tests.unnecessary">
<srcfiles dir="src"
includes="**/*.java" />
<mapper type="glob"
from="*.java" to="*.class" />
</uptodate>
38
Propriedades condicionais
<condition> define propriedades usando diversas
condições e operadores <and>, <or> e <not>
Sub-elementos de <condition>

argonavis.com.br

<avaliable>, <uptodate>, <os>, <equals>,
<isset>, <checksum>, <http>, <socket>,
<filesmatch>, <contains>, <istrue>, <isfalse>

39
Exemplos de <condition>
<condition property="tests.unnecessary">
<and>
<uptodate>
<srcfiles dir="src" includes="**/*.java"/>
<mapper type="glob" from="*.java"
to="${build.dir}/classes/*.class" />
</uptodate>

argonavis.com.br

<uptodate>
<srcfiles dir="test" includes="**/*.java"/>
<mapper type="glob" from="*.java"
to="${test.dir}/*.class" />
</uptodate>
<uptodate>
<srcfiles dir="test" excludes="**/*.java"/>
<mapper type="glob" from="*" to="${test.dir}/*" />
</uptodate>
</and>
</condition>

40
Targets condicionais
Às vezes o que mais interessa em uma propriedade é
se ela está definida ou não
Seu estado pode ser usado para executar alvos
condicionalmente

argonavis.com.br

<target name="copysource" if="copy.source">
<copy todir="build/classes">
<fileset dir="src"/>
</copy>
</target>
<target name="jar" depends="compile,copysource">
<jar basedir="build/classes" jarfile="dist/our.jar">
</target>

O alvo acima executará se qualquer valor for atribuido
ant -Dcopy.source=false jar
41
Patternsets condicionais

argonavis.com.br

Patternsets que incluem ou excluem padrões de
localização de arquivos podem também ser
condicionais
No bloco abaixo alguns arquivos são excluídos se uma
determinada propriedade não estiver definida
<javac srcdir="src" destdir="${build.dir}/classes">
<exclude name="antbook/xdoclet/*.java"
unless="xdoclet.present" />
</javac>

42
Falha condicional
A tarefa <fail> pode ser usada para causar a falha de
um build

argonavis.com.br

Pode ser controlada com atributos if e unless para
testar propriedades e falhar dependendo de condições

43
Referências
Todos os elementos do Ant podem ser identificados
com um atributo id
O elemento pode ser chamado por referência em
diversas situações, referindo-se ao seu id através do
atributo refid

argonavis.com.br

<path id="compile.classpath">
<pathelement location="${lucene.jar}"/>
<pathelement location="${tidy.jar}"/>
</path>
<path id="test.classpath">
<path refid="compile.classpath"/>
<pathelement location="${junit.jar}"/>
<pathelement location="${build.dir}/classes"/>
<pathelement location="${build.dir}/test"/>
</path>

44
Path como string
Um path pode ser transformado em String, se for
necessário, simplesmente passando sua referência na
definição de uma propriedade
Exemplo
<path id="the.path">
<pathelement path="some.jar;another.jar"/>
</path>

argonavis.com.br

<property name="path.string" refid="the.path"/>
<echo message="path = ${path.string}"/>

Resultado
[echo] path = /home/ant/some.jar: /home/ant/another.jar

45
Tarefas úteis (4): J2EE
<ear destfile="app.ear" appxml="application.xml">
<fileset dir="${build}" includes="*.jar,*.war"/>
</ear>

argonavis.com.br

<ejbjar srcdir="${build}" descriptordir="${xml.dir}" ... >
<jboss destdir="${deployjars.dir}" />
</ejbjar>
Há suporte aos principais servidores de aplicação
<war destfile="bookstore.war" webxml="meta/metainf.xml">
<fileset dir="${build}/${bookstore2}" >
<include name="*.jsp" />
WEB-INF/web.xml
<exclude name="*.txt" />
Fileset para raiz do WAR
</fileset>
<classes dir="${build}" >
Fileset para
<include name="database/*.class" />
WEB-INF/classes
</classes>
Fileset para
<lib dir="bibliotecas" />
WEB-INF/lib
<webinf dir="etc" />
</war>
Fileset para WEB-INF/

46
Tarefas úteis (5): extensão
<ejbdoclet> e <webdoclet>*: Geram código

argonavis.com.br

Requer JAR de xdoclet.sourceforge.net
Ideal para geração automática de arquivos de configuração
(web.xml, ejb-jar.xml, application.xml, taglibs, strutsconfig, 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/>
Detalhes da configuração do
<homeinterface/>
componente estão nos comentários de
<utilobject/>
JavaDocs do código-fonte dos arquivos
<entitypk/>
envolvidos e arquivos de template
<entitycmp/>
<deploymentdescriptor destdir="${dd.dir}"/>
<jboss datasource="java:/OracleDS" />
</ejbdoclet>
* Nomes convencionais criados a partir de tarefa externa

47
Tarefas úteis (6): execução
<java>: executa o interpretador Java
<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>

argonavis.com.br

<exec>: executa um comando do sistema
<target name="orbd">
<exec executable="${java.home}binorbd">
<arg line="-ORBInitialHost ${nameserver.host}"/>
</exec>
</target>

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

48
Tarefas úteis (7): rede
<ftp>: Realiza a comunicação com um servidor FTP
remoto para upload ou download de arquivos

argonavis.com.br

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>

49
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
<style basedir="xmldocs"
destdir="htmldocs"
style="xmltohtml.xsl" />

argonavis.com.br

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"/>
build.xml
(...)
<xsl:valueof select="$docsdir"/>
cartao2html.xsl (...)

50
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" />

argonavis.com.br

<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>

51
Tarefas úteis (10): chamadas
<ant>: chama alvo de subprojeto (buildfile externo)
<target name="run-sub">
<ant dir="subproj" />
</target>
Chama alvo default de build.xml
localizado no subdiretório subproj/

<target name="run-sub">
<ant dir="subproj" >
<property name="versao"
value="1.0" />
</ant>
</target>

argonavis.com.br

<antcall>: chama alvo local
<target name="fazer-isto">
<antcall target="fazer">
<param name="oque"
value="isto" />
</antcall>
</target>

Define propriedade que
será lida no outro build.xml

<target name="fazer-aquilo">
<antcall target="fazer">
<param name="oque"
value="aquilo" />
</antcall>
</target>

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

Template!

52
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 Framework

Exemplo:

argonavis.com.br

No exemplo abaixo, o som festa.wav será tocado
quando o build terminar sem erros fatais. vaia.wav
tocará 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>

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

argonavis.com.br

sound.xml

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

<?xml version="1.0" encoding="iso-8859-1" ?>
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE project [
<!DOCTYPE project [
<!ENTITY sound SYSTEM "sound.xml">
<!ENTITY sound SYSTEM "sound.xml">
]>
]>
<project default="dtd">
<project default="dtd">
<description>Gera um DTD para o Ant</description>
<description>Gera um DTD para o Ant</description>
<target name="init">
<target name="init">

&sound;
&sound;

</target>
</target>
<target name="dtd" depends="init">
<target name="dtd" depends="init">
<antstructure output="ant.dtd" />
<antstructure output="ant.dtd" />
</target>
</target>
</project>
</project>

54
Integração com outras aplicações
Ant 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.

Eventos

argonavis.com.br

Build iniciou/terminou
Alvo iniciou/terminou
Tarefa iniciou/terminou
Mensagens logadas

Vários listeners e loggers pré-definidos
Pode-se usar ou estender classe existente.
Para gravar processo (build) em XML:
> ant -listener org.apache.tools.ant.XmlLogger

55
Integração com editores e IDEs
Produtos 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 Java
http://ant.netbeans.org/

Eclipse
argonavis.com.br

http://eclipse.org

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

Jext (AntWork plug-in)
ftp://jext.sourceforge.net/pub/jext/plugins/AntWork.zip
56
Integração com o JEdit

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

argonavis.com.br

Resultados são mostrados
no Console do JEdit

57
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

argonavis.com.br

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/.

58
Curso J820
Produtividade e Qualidade em Java:
Ferramentas e Metodologias
Revisão 1.1

© 2002, 2003, Helder da Rocha
(helder@acm.org)

argonavis.com.br

Weitere ähnliche Inhalte

Was ist angesagt?

Fundações e obras de terra - Parte 01
Fundações e obras de terra - Parte 01Fundações e obras de terra - Parte 01
Fundações e obras de terra - Parte 01Andre Luiz Vicente
 
PLANEJ. CONTABIL TRIBUTARIO
PLANEJ. CONTABIL TRIBUTARIOPLANEJ. CONTABIL TRIBUTARIO
PLANEJ. CONTABIL TRIBUTARIOMichelle Moraes
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Helder da Rocha
 
Tutorial do project libre PORTUGUÊS
Tutorial do project libre PORTUGUÊSTutorial do project libre PORTUGUÊS
Tutorial do project libre PORTUGUÊSSILMAR PEREIRA
 
PLANEJAMENTO TRIBUTÁRIO
PLANEJAMENTO TRIBUTÁRIOPLANEJAMENTO TRIBUTÁRIO
PLANEJAMENTO TRIBUTÁRIOCarlos Rocha
 
DIREITO TRIBUTÁRIO OAB XX ESTRATÉGIA AULA 07
DIREITO TRIBUTÁRIO OAB XX ESTRATÉGIA AULA 07DIREITO TRIBUTÁRIO OAB XX ESTRATÉGIA AULA 07
DIREITO TRIBUTÁRIO OAB XX ESTRATÉGIA AULA 07Esdras Arthur Lopes Pessoa
 
Exercicios resolvidos contabilidade geral aula 01 cathedra
Exercicios resolvidos contabilidade geral   aula 01 cathedraExercicios resolvidos contabilidade geral   aula 01 cathedra
Exercicios resolvidos contabilidade geral aula 01 cathedracontacontabil
 
Lei de improbidade ESQUEMATIZADA versão 2019
Lei de improbidade ESQUEMATIZADA versão 2019Lei de improbidade ESQUEMATIZADA versão 2019
Lei de improbidade ESQUEMATIZADA versão 2019Prof. Antonio Daud Jr
 
Padronização de Nomenclatura para Banco de Dados
Padronização de Nomenclatura para Banco de DadosPadronização de Nomenclatura para Banco de Dados
Padronização de Nomenclatura para Banco de DadosSamuelson Brito
 
The Canvas of Business Case (Modelo de Caso de Negócio)
The Canvas of Business Case (Modelo de Caso de Negócio)The Canvas of Business Case (Modelo de Caso de Negócio)
The Canvas of Business Case (Modelo de Caso de Negócio)Rildo (@rildosan) Santos
 
Prova TRT SC - Analista da área Judiciária
Prova TRT SC - Analista da área JudiciáriaProva TRT SC - Analista da área Judiciária
Prova TRT SC - Analista da área JudiciáriaProf. Antonio Daud Jr
 
Análise, Simulação e Melhoria de Processo com WBM
Análise, Simulação e Melhoria de Processo com WBMAnálise, Simulação e Melhoria de Processo com WBM
Análise, Simulação e Melhoria de Processo com WBMRildo (@rildosan) Santos
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Helder da Rocha
 

Was ist angesagt? (20)

Fundações e obras de terra - Parte 01
Fundações e obras de terra - Parte 01Fundações e obras de terra - Parte 01
Fundações e obras de terra - Parte 01
 
PLANEJ. CONTABIL TRIBUTARIO
PLANEJ. CONTABIL TRIBUTARIOPLANEJ. CONTABIL TRIBUTARIO
PLANEJ. CONTABIL TRIBUTARIO
 
Cronograma físico financeiro, tutorial
Cronograma físico financeiro, tutorialCronograma físico financeiro, tutorial
Cronograma físico financeiro, tutorial
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
 
Tutorial do project libre PORTUGUÊS
Tutorial do project libre PORTUGUÊSTutorial do project libre PORTUGUÊS
Tutorial do project libre PORTUGUÊS
 
PLANEJAMENTO TRIBUTÁRIO
PLANEJAMENTO TRIBUTÁRIOPLANEJAMENTO TRIBUTÁRIO
PLANEJAMENTO TRIBUTÁRIO
 
DIREITO TRIBUTÁRIO OAB XX ESTRATÉGIA AULA 07
DIREITO TRIBUTÁRIO OAB XX ESTRATÉGIA AULA 07DIREITO TRIBUTÁRIO OAB XX ESTRATÉGIA AULA 07
DIREITO TRIBUTÁRIO OAB XX ESTRATÉGIA AULA 07
 
Exercicios resolvidos contabilidade geral aula 01 cathedra
Exercicios resolvidos contabilidade geral   aula 01 cathedraExercicios resolvidos contabilidade geral   aula 01 cathedra
Exercicios resolvidos contabilidade geral aula 01 cathedra
 
Lei de improbidade ESQUEMATIZADA versão 2019
Lei de improbidade ESQUEMATIZADA versão 2019Lei de improbidade ESQUEMATIZADA versão 2019
Lei de improbidade ESQUEMATIZADA versão 2019
 
Aula 18 nbr 12721
Aula 18   nbr 12721Aula 18   nbr 12721
Aula 18 nbr 12721
 
Padronização de Nomenclatura para Banco de Dados
Padronização de Nomenclatura para Banco de DadosPadronização de Nomenclatura para Banco de Dados
Padronização de Nomenclatura para Banco de Dados
 
Desenvolvimento de sistemas embarcados
Desenvolvimento de sistemas embarcadosDesenvolvimento de sistemas embarcados
Desenvolvimento de sistemas embarcados
 
The Canvas of Business Case (Modelo de Caso de Negócio)
The Canvas of Business Case (Modelo de Caso de Negócio)The Canvas of Business Case (Modelo de Caso de Negócio)
The Canvas of Business Case (Modelo de Caso de Negócio)
 
calculos-fluidos
calculos-fluidoscalculos-fluidos
calculos-fluidos
 
Prova TRT SC - Analista da área Judiciária
Prova TRT SC - Analista da área JudiciáriaProva TRT SC - Analista da área Judiciária
Prova TRT SC - Analista da área Judiciária
 
Resumo de aulas de planejamento tributário
Resumo de aulas de planejamento tributárioResumo de aulas de planejamento tributário
Resumo de aulas de planejamento tributário
 
Análise, Simulação e Melhoria de Processo com WBM
Análise, Simulação e Melhoria de Processo com WBMAnálise, Simulação e Melhoria de Processo com WBM
Análise, Simulação e Melhoria de Processo com WBM
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)
 
AULA OAB XX ESTRATÉGIA DIREITO CIVIL 07
AULA OAB XX ESTRATÉGIA  DIREITO CIVIL  07AULA OAB XX ESTRATÉGIA  DIREITO CIVIL  07
AULA OAB XX ESTRATÉGIA DIREITO CIVIL 07
 
Gestão do Escopo do Projeto
Gestão do Escopo do ProjetoGestão do Escopo do Projeto
Gestão do Escopo do Projeto
 

Ähnlich wie Introdução ao Apache Ant

Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Ambiente de Desenvolvimento Java usando Ant
Ambiente de Desenvolvimento Java usando AntAmbiente de Desenvolvimento Java usando Ant
Ambiente de Desenvolvimento Java usando AntDenis L Presciliano
 
Build Automation Evolved
Build Automation EvolvedBuild Automation Evolved
Build Automation EvolvedMarcelo Diniz
 
xDocLet - Geração de código com xdoclet
xDocLet - Geração de código com xdocletxDocLet - Geração de código com xdoclet
xDocLet - Geração de código com xdocletDenis L Presciliano
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?Rafael Benevides
 
GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!Bruno Borges
 
TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.Rogério Napoleão Jr.
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks phpIgor Moura
 
TDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoTDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoCezinha Anjos
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Fabrízio Mello
 

Ähnlich wie Introdução ao Apache Ant (20)

Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Apache Ant
Apache AntApache Ant
Apache Ant
 
Java 08
Java 08Java 08
Java 08
 
Ambiente de Desenvolvimento Java usando Ant
Ambiente de Desenvolvimento Java usando AntAmbiente de Desenvolvimento Java usando Ant
Ambiente de Desenvolvimento Java usando Ant
 
Build Automation Evolved
Build Automation EvolvedBuild Automation Evolved
Build Automation Evolved
 
xDocLet - Geração de código com xdoclet
xDocLet - Geração de código com xdocletxDocLet - Geração de código com xdoclet
xDocLet - Geração de código com xdoclet
 
J530 14 xdoclet
J530 14 xdocletJ530 14 xdoclet
J530 14 xdoclet
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?
 
Precisamos falar sobre Gradle
Precisamos falar sobre GradlePrecisamos falar sobre Gradle
Precisamos falar sobre Gradle
 
GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!
 
Palestra cbq
Palestra cbqPalestra cbq
Palestra cbq
 
Apache Struts
Apache StrutsApache Struts
Apache Struts
 
TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.
 
Tutorial JSF 2.0 (2012)
Tutorial JSF 2.0 (2012)Tutorial JSF 2.0 (2012)
Tutorial JSF 2.0 (2012)
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks php
 
TDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoTDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direito
 
Snep arquitetura
Snep arquiteturaSnep arquitetura
Snep arquitetura
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012
 
Tag Libraries e JSTL
Tag Libraries e JSTLTag Libraries e JSTL
Tag Libraries e JSTL
 

Mehr von Denis L Presciliano

Como construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsComo construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsDenis L Presciliano
 
Coleções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsColeções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsDenis L Presciliano
 
Funcamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteFuncamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteDenis L Presciliano
 
Reuso com Herança e Composição
Reuso com Herança e ComposiçãoReuso com Herança e Composição
Reuso com Herança e ComposiçãoDenis L Presciliano
 
Tipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxoTipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxoDenis L Presciliano
 
Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Denis L Presciliano
 
Configuração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntConfiguração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntDenis L Presciliano
 
Programação Orientada a objetos em Java
Programação Orientada a objetos em JavaProgramação Orientada a objetos em Java
Programação Orientada a objetos em JavaDenis L Presciliano
 

Mehr von Denis L Presciliano (20)

Funmentos de Objetos Remotos
Funmentos de Objetos RemotosFunmentos de Objetos Remotos
Funmentos de Objetos Remotos
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Como construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsComo construir aplicações gráficas e applets
Como construir aplicações gráficas e applets
 
Classes internas
Classes internasClasses internas
Classes internas
 
Entrada e Saída
Entrada e SaídaEntrada e Saída
Entrada e Saída
 
Coleções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsColeções Propriedade, Resources e Strings
Coleções Propriedade, Resources e Strings
 
Funcamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteFuncamentos de Programação Concorrente
Funcamentos de Programação Concorrente
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
Erros, exceções e asserções
Erros, exceções e asserçõesErros, exceções e asserções
Erros, exceções e asserções
 
Interfaces e Porlimosfismo
Interfaces e PorlimosfismoInterfaces e Porlimosfismo
Interfaces e Porlimosfismo
 
Reuso com Herança e Composição
Reuso com Herança e ComposiçãoReuso com Herança e Composição
Reuso com Herança e Composição
 
Pacotes e Encapsulamento
Pacotes e EncapsulamentoPacotes e Encapsulamento
Pacotes e Encapsulamento
 
Como criar classes e objetos
Como criar classes e objetosComo criar classes e objetos
Como criar classes e objetos
 
Tipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxoTipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxo
 
Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Como usar a documentação da API Java 2
Como usar a documentação da API Java 2
 
Configuração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntConfiguração do ambiente JEdit + Ant
Configuração do ambiente JEdit + Ant
 
Programação Orientada a objetos em Java
Programação Orientada a objetos em JavaProgramação Orientada a objetos em Java
Programação Orientada a objetos em Java
 
Introdução a tecnologia Java
Introdução a tecnologia JavaIntrodução a tecnologia Java
Introdução a tecnologia Java
 
Fundamentos de Sockets
Fundamentos de SocketsFundamentos de Sockets
Fundamentos de Sockets
 
J530 15 workshop
J530 15 workshopJ530 15 workshop
J530 15 workshop
 

Introdução ao Apache Ant

  • 1. J820 Introdução ao Apache Ant Helder da Rocha (helder@acm.org) argonavis.com.br
  • 2. O que é Ant? Uma ferramenta para construção de aplicações Implementada em Java Baseada em roteiros XML Extensível (via scripts ou classes) 'padrão' do mercado Open Source (Grupo Apache, Projeto Jakarta) argonavis.com.br Semelhante a make, porém Mais simples e estruturada (XML) Mais adequada a tarefas comuns em projetos Java Independente de plataforma Onde encontrar: http://ant.apache.org 2
  • 3. Para que serve? Para montar praticamente qualquer aplicação Java que consista de mais que meia dúzia de classes; Aplicações argonavis.com.br Distribuídas em pacotes Que requerem a definição de classpaths locais, e precisam vincular código a bibliotecas (JARs) Cuja criação/instalação depende de mais que uma simples chamada ao javac. Ex: RMI, CORBA, EJB, servlets, JSP,... Para automatizar processos frequentes Javadoc, XSLT, implantação de serviços Web e J2EE (deployment), CVS, criação de JARs, testes, FTP, email 3
  • 4. Como funciona? Ant executa roteiros escritos em XML: 'buildfiles' Cada projeto do Ant possui um buildfile Subprojetos podem ter, opcionalmente, buildfiles adicionais chamados durante a execução do primeiro argonavis.com.br Cada projeto possui uma coleção de alvos Cada alvo consiste de uma seqüência de tarefas Exemplos de execução ant Procura build.xml no diretório atual e roda alvo default ant -buildfile outro.xml Executa alvo default de arquivo outro.xml ant compilar Roda alvo 'compilar' e possíveis dependências em build.xml 4
  • 6. Buildfile argonavis.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üência Pode-se estabelecer dependências entre alvos Deve 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>, ... 6
  • 7. Buildfile (2) <?xml version="1.0" encoding="iso-8859-1" ?> <!-- Compila diversos arquivos .java --> Propriedades argonavis.com.br <project default="compile" basedir="."> <property name="src.dir" value="src" /> <property name="build.dir" value="classes" /> <target name="init"> <mkdir dir="${build.dir}" /> </target> Alvos <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> Tarefas <pathelement location="${build.dir}" /> </classpath> </javac> Elementos embutidos nas tarefas </target> </project> 7
  • 8. Exemplo Executando buildfile da página anterior C:usrpalestraantdemo> ant Buildfile: build.xml init: [mkdir] Created dir: C:usrpalestraantdemoclasses compile: [javac] Compiling 2 source files to C:usrpalestraantdemoclasses argonavis.com.br BUILD SUCCESSFUL Total time: 4 seconds C:usrpalestraantdemo> ant clean Buildfile: build.xml clean: [delete] Deleting dir: C:usrpalestraantdemoclasses BUILD SUCCESSFUL Total time: 2 seconds C:usrpalestraantdemo> ANTES de 'ant' DEPOIS de 'ant clean' build.xml src argonavis util Tiracentos.java TiracentosTest.java DEPOIS de 'ant' ou 'ant compile' build.xml src argonavis util Tiracentos.java TiracentosTest.java classes argonavis util Tiracentos.class TiracentosTest.class 8
  • 9. Dependências Fazem com que a chamada de um alvo cause a chamada de outros alvos, em determinada ordem argonavis.com.br Promovem reuso de código <target <target <target <target <target <target <target <target <target init name="init" /> name="clean" /> name="compile" depends="init"/> name="javadoc" depends="compile"/> name="build" depends="compile"/> name="test" depends="build"/> name="deploy" depends="build"/> name="email" depends="archive"/> name="archive" depends="build, javadoc"/> <target name="re-deploy" depends="clean, deploy"/> compile javadoc build test deploy 1 archive 2 2 re-deploy 1 email clean 9
  • 10. Tarefas condicionadas Algumas 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 argonavis.com.br 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 pacotes Ex: se Conta.java declara pertencer a pacote banco, deve estar em diretório banco dentro de src/ 10
  • 11. O que se pode fazer com Ant? Compilar. <javac>, <csc> Gerar documentação <javadoc>, <junitreport>, <style>, <stylebook> Gerar código (XDoclet) <ejbdoclet>, <webdoclet> argonavis.com.br 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> 11
  • 12. Tarefas úteis (1) <javac>: Chama o compilador Java <javac srcdir="dirfontes" destdir="dirbuild" > <classpath> <pathelement path="arquivo.jar" /> <pathelement path="/arquivos" /> </classpath> <classpath idref="extra" /> </javac> argonavis.com.br <jar>: Monta um JAR <jar destfile="bin/executavel.jar"> <manifest> <attribute name="Main-class" value="exemplo.main.Exec"> </manifest> <fileset dir="${build.dir}"/> </jar> 12
  • 13. A tarefa <javac> É a tarefa mais importante de um processo típico de montagem Oferece uma fachada sobre compiladores Java Suporta 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 argonavis.com.br é o mesmo que <javac srcdir="." destdir="build"> <classpath path="abc.jar;c:exemplos" /> </javac> 13
  • 14. <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 FileSet argonavis.com.br Outra 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> 14
  • 15. Tarefas úteis (2) <mkdir>: cria diretórios <mkdir dir="diretorio" /> <copy>: copia arquivos <copy todir="dir" file="arquivo" /> <copy todir="dir"> <fileset dir="fonte" includes="*.txt" /> </copy> argonavis.com.br <delete>: apaga arquivos <delete file="arquivo" /> <delete dir="diretorio"/> 15
  • 16. Tipos de dados (1) <fileset>: árvore de arquivos e diretórios argonavis.com.br Conteú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 16
  • 17. FileSets filtrados Pode-se filtrar os elementos de um FileSet usando subelementos <include> e <exclude> Pode-se também usar os atributos includes e excludes O bloco abaixo inclui apenas os arquivos *.txt diretamente abaixo de pasta <fileset dir="pasta"> <include name="*.txt" /> </fileset> argonavis.com.br Este outro inclui todos os *.txt em qualquer lugar da árvore exceto os *-old.txt logo abaixo de pasta <fileset dir="pasta"> <include name="**/*.txt" /> <exclude name="*-old.txt" /> </fileset> 17
  • 18. ZipFileSet argonavis.com.br Tipo de FileSet Permite incluir prefixos em arquivos armazenados em ZIPs (ou JARs) Prefixos são transformados em diretórios na descompressão Exemplo de uso <jar destfile="arquivo.jar"> <zipfileset dir="dados" prefix="extra/dados" /> </jar> 18
  • 19. Tipos de dados (2) <patternset>: coleção de padrões de busca <patternset id="project.jars" > <include name="**/*.jar"/> <exclude name="**/*-test.jar"/> </patternset> Padrões podem ser reusados e são identificados pelo ID <path>: coleção de caminhos (path-like structures) argonavis.com.br 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> 19
  • 20. Path-like structures São listas ordenadas de elementos de um caminho do sistema de arquivos Exemplo argonavis.com.br <classpath> <pathelement location="lib/arquivo.jar" /> <pathelement location="c:classes" /> <pathelement path="/usr/bin:/usr:/lib" /> </classpath> O atributo location permite especificar um único arquivo ou diretório. O atributo path permite especificar um caminho inteiro As barras e separadores serão convertidos ao sistema operacional nativo 20
  • 21. Paths e FileSets argonavis.com.br Paths podem ser compostos de conjuntos de arquivos usando <fileset> <path id="app.path"> <fileset dir="app.dir" /> <fileset dir="mais.dir"> <include name="**/*.jar" /> <include name="**/*.zip" /> </fileset> <pathelement location="c:classes" /> <pathelement path="/usr/bin:/usr:/lib" /> </path> 21
  • 22. Pattern Sets São coleções de padrões <include> e <exclude> Sintaxe * combina com um ou mais caracteres ? combina com um caractere **, usado como nome de diretório, combina com todos os diretórios daquele ponto em diante na árvore / ou no final de um diretório, é equivalente a /** argonavis.com.br Pattern sets podem ser definidos em Atributos includes e excludes de um fileset Arquivos com um pattern por linha carregados através de atributos includesfile e excludesfile Elementos <patternset> identificados por um id contendo listas de <include> e <exclude> 22
  • 23. Exemplos de Pattern Sets <patternset id="docs"> <include name="**/*.htm*" /> <exclude name="~*.htm*" /> </patternset> argonavis.com.br <patternset id="webdocs"> <include name="**/*.gif, **/*.jpg"/> <patternset refid="docs" /> </patternset> 23
  • 24. Tipos de dados (4): seletores argonavis.com.br Permitem a seleção dos elementos de um fileset usando critérios além dos definidos por <include> e <exclude> Sete seletores básicos (pode-se criar novos) <contains> - Seleciona arquivos que contém determinado texto <date> - Arquivos modificados antes ou depois de certa data <depend> - Seleciona arquivos cuja data de modificação seja posterior a arquivos localizados em outro lugar <depth> - Seleciona arquivos encontrados até certa profundidade de uma árvore de diretórios <filename> - Equivalente ao include e exclude <present> - Seleciona arquivo com base na sua (in)existência <size> - Seleciona com base no tamanho em bytes Exemplo: Seleciona arquivos do diretório "fonte" que também estão presentes em "destino" <fileset dir="fonte"> <present targetdir="destino"/> </fileset> 24
  • 25. argonavis.com.br Exemplos com seletores <copy todir="novos"> <fileset dir="docs"> <not> <present targetdir="public_html" /> </not> </fileset> Seletores podem ser combinados dentro </copy> de containers de seletores para realizar lógica de seleção <copy todir="novos"> <and>, <or>, <none>, <majority> <fileset dir="docs"> <and> <contains text="Revision" /> <not><present targetdir="public_html"/></not> </and> </fileset> </copy> 25
  • 26. Mapper <mapper>: altera nomes de arquivos durante cópias ou transformações (use dentro de <copy>, por exemplo) Seis tipos: identity, flatten, merge, regexp, glob, package argonavis.com.br build.xml src argonavis util Tiracentos.java TiracentosTest.java <mapper type="package" from="*.java" to="*.txt"/> <mapper type="flatten" /> <mapper type="glob" from="*.java" to="*.java.bak"/> build.xml src argonavis.util.Tiracentos.txt argonavis.util.TiracentosTest.txt build.xml src Tiracentos.java TiracentosTest.java build.xml src argonavis util Tiracentos.java.bak TiracentosTest.java.bak 26
  • 27. 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 argonavis.com.br <copy todir="${dest.dir}"> <fileset dir="${src.dir}"/> <filterset> <filter token="javahome" value="c:j2sdk1.4"/> </filterset> </copy> Pares token=valor podem ser carregados de arquivo: <filterset> <filtersfile file="build.properties" /> </filterset> Substituição sem tokens pode ser feita com <replacetoken> 27
  • 28. Exemplo com Filter Sets Exemplo com inserção de datas: teste.txt Data de hoje: @data@ / @hora@ Bulildfile argonavis.com.br <tstamp /> <copy todir="gerados"> <fileset dir="testes" includes="teste.txt" /> <filterset> <filter token="data" value="${DSTAMP}" /> <filter token="hora" value="${TSTAMP}" /> </filterset> </copy> Resultado Data de hoje: 20030528 / 1458 28
  • 29. FilterChains e FilterReaders argonavis.com.br FilterReader é um filtro pré-configurado FilterChains são grupos ordenados de FilterReaders executados em conjunto Usados dentro de <copy>, <move>, <loadfile> e <loadproperties> Alguns FilterReaders <classconstants>, <expandproperties>, <linecontains>, <prefixlines>, <replacetokens>, <stripjavacomments>, <striplinebreaks>, <tabstospaces> 29
  • 30. Exemplos de FilterChain argonavis.com.br <copy todir="novos"> <filterchain> <stripcomments> <comment value="#"/> </stripcomments> </filterchain> </copy> <loadproperties srcfile="Constantes.class"> <filterchain> <classconstants /> <prefixlines prefix="Constantes." /> </filterchain> </loadproperties > 30
  • 31. 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' argonavis.com.br <target name="generate-docs"> Copiar de ${src.dir} <mkdir dir="docs/api"/> <copy todir="tmp"> <fileset dir="${src.dir}"> <include name="**/*.java" /> <exclude name="**/**Test.java" /> </fileset> Procurar em todos os </copy> subdiretórios <javadoc destdir="docs/api" packagenames="argonavis.*" sourcepath="tmp" /> <delete dir="tmp" /> </target> Onde achar as fontes 31
  • 32. Propriedades Todas podem ser lidas com ${nome} Nativas do Ant argonavis.com.br ant.file - caminho completo do build.xml ant.home - diretório de instalação do ant ant.java.version - versão do Java usado ant.project.name - nome do projeto ant.version - versão do Ant basedir - diretório onde está o build.xml Nativas do Java ou do JVM Qualquer propriedade nativa do Java pode ser lida da mesma forma 32
  • 33. 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" /> app.ver=1.0 docs.dir=c:docs codigo=15323 arquivo.properties argonavis.com.br Podem ser passadas na linha de comando c:> 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}" /> 33
  • 34. Propriedades são imutáveis Uma vez definida, uma propriedade não muda de valor O primeiro valor atribuído é sempre usado Tentativas posteriores de alterar o valor da propriedade não funcionam argonavis.com.br Propriedades passadas em linha de comando são definidas antes das propriedades dentro do build.xml ou build.properties 34
  • 35. Propriedades especiais <tstamp>: Grava um instante A hora e data podem ser recuperados como propriedades ${TSTAMP} ${DSTAMP} ${TODAY} hhmm aaaammdd dia mes ano 1345 20020525 25 May 2002 Novas propriedades podem ser definidas, locale, etc. Uso típico: <tstamp/> argonavis.com.br <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> 35
  • 36. 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 relativo Usando name/location pode-se definir valores absolutos argonavis.com.br <property name="build.dir" location="classes" /> guardará o caminho completo ao diretório local build 36
  • 37. Propriedades condicionais <available> irá definir uma propriedade (com valor true) se um determinado recurso existir <available property="arquivo.existe" file="importante.txt" type="file" /> argonavis.com.br A existência ou não de uma propriedade pode ser usada em blocos condicionais <target name="nome" if="propriedade"> ... </target> 37
  • 38. 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 argonavis.com.br Exemplo de uso <uptodate property="tests.unnecessary"> <srcfiles dir="src" includes="**/*.java" /> <mapper type="glob" from="*.java" to="*.class" /> </uptodate> 38
  • 39. Propriedades condicionais <condition> define propriedades usando diversas condições e operadores <and>, <or> e <not> Sub-elementos de <condition> argonavis.com.br <avaliable>, <uptodate>, <os>, <equals>, <isset>, <checksum>, <http>, <socket>, <filesmatch>, <contains>, <istrue>, <isfalse> 39
  • 40. Exemplos de <condition> <condition property="tests.unnecessary"> <and> <uptodate> <srcfiles dir="src" includes="**/*.java"/> <mapper type="glob" from="*.java" to="${build.dir}/classes/*.class" /> </uptodate> argonavis.com.br <uptodate> <srcfiles dir="test" includes="**/*.java"/> <mapper type="glob" from="*.java" to="${test.dir}/*.class" /> </uptodate> <uptodate> <srcfiles dir="test" excludes="**/*.java"/> <mapper type="glob" from="*" to="${test.dir}/*" /> </uptodate> </and> </condition> 40
  • 41. Targets condicionais Às vezes o que mais interessa em uma propriedade é se ela está definida ou não Seu estado pode ser usado para executar alvos condicionalmente argonavis.com.br <target name="copysource" if="copy.source"> <copy todir="build/classes"> <fileset dir="src"/> </copy> </target> <target name="jar" depends="compile,copysource"> <jar basedir="build/classes" jarfile="dist/our.jar"> </target> O alvo acima executará se qualquer valor for atribuido ant -Dcopy.source=false jar 41
  • 42. Patternsets condicionais argonavis.com.br Patternsets que incluem ou excluem padrões de localização de arquivos podem também ser condicionais No bloco abaixo alguns arquivos são excluídos se uma determinada propriedade não estiver definida <javac srcdir="src" destdir="${build.dir}/classes"> <exclude name="antbook/xdoclet/*.java" unless="xdoclet.present" /> </javac> 42
  • 43. Falha condicional A tarefa <fail> pode ser usada para causar a falha de um build argonavis.com.br Pode ser controlada com atributos if e unless para testar propriedades e falhar dependendo de condições 43
  • 44. Referências Todos os elementos do Ant podem ser identificados com um atributo id O elemento pode ser chamado por referência em diversas situações, referindo-se ao seu id através do atributo refid argonavis.com.br <path id="compile.classpath"> <pathelement location="${lucene.jar}"/> <pathelement location="${tidy.jar}"/> </path> <path id="test.classpath"> <path refid="compile.classpath"/> <pathelement location="${junit.jar}"/> <pathelement location="${build.dir}/classes"/> <pathelement location="${build.dir}/test"/> </path> 44
  • 45. Path como string Um path pode ser transformado em String, se for necessário, simplesmente passando sua referência na definição de uma propriedade Exemplo <path id="the.path"> <pathelement path="some.jar;another.jar"/> </path> argonavis.com.br <property name="path.string" refid="the.path"/> <echo message="path = ${path.string}"/> Resultado [echo] path = /home/ant/some.jar: /home/ant/another.jar 45
  • 46. Tarefas úteis (4): J2EE <ear destfile="app.ear" appxml="application.xml"> <fileset dir="${build}" includes="*.jar,*.war"/> </ear> argonavis.com.br <ejbjar srcdir="${build}" descriptordir="${xml.dir}" ... > <jboss destdir="${deployjars.dir}" /> </ejbjar> Há suporte aos principais servidores de aplicação <war destfile="bookstore.war" webxml="meta/metainf.xml"> <fileset dir="${build}/${bookstore2}" > <include name="*.jsp" /> WEB-INF/web.xml <exclude name="*.txt" /> Fileset para raiz do WAR </fileset> <classes dir="${build}" > Fileset para <include name="database/*.class" /> WEB-INF/classes </classes> Fileset para <lib dir="bibliotecas" /> WEB-INF/lib <webinf dir="etc" /> </war> Fileset para WEB-INF/ 46
  • 47. Tarefas úteis (5): extensão <ejbdoclet> e <webdoclet>*: Geram código argonavis.com.br Requer JAR de xdoclet.sourceforge.net Ideal para geração automática de arquivos de configuração (web.xml, ejb-jar.xml, application.xml, taglibs, strutsconfig, 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/> Detalhes da configuração do <homeinterface/> componente estão nos comentários de <utilobject/> JavaDocs do código-fonte dos arquivos <entitypk/> envolvidos e arquivos de template <entitycmp/> <deploymentdescriptor destdir="${dd.dir}"/> <jboss datasource="java:/OracleDS" /> </ejbdoclet> * Nomes convencionais criados a partir de tarefa externa 47
  • 48. Tarefas úteis (6): execução <java>: executa o interpretador Java <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> argonavis.com.br <exec>: executa um comando do sistema <target name="orbd"> <exec executable="${java.home}binorbd"> <arg line="-ORBInitialHost ${nameserver.host}"/> </exec> </target> <apply>: semelhante a <exec> mas usado em executáveis que operam sobre outros arquivos 48
  • 49. Tarefas úteis (7): rede <ftp>: Realiza a comunicação com um servidor FTP remoto para upload ou download de arquivos argonavis.com.br 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> 49
  • 50. 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 <style basedir="xmldocs" destdir="htmldocs" style="xmltohtml.xsl" /> argonavis.com.br 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"/> build.xml (...) <xsl:valueof select="$docsdir"/> cartao2html.xsl (...) 50
  • 51. 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" /> argonavis.com.br <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> 51
  • 52. Tarefas úteis (10): chamadas <ant>: chama alvo de subprojeto (buildfile externo) <target name="run-sub"> <ant dir="subproj" /> </target> Chama alvo default de build.xml localizado no subdiretório subproj/ <target name="run-sub"> <ant dir="subproj" > <property name="versao" value="1.0" /> </ant> </target> argonavis.com.br <antcall>: chama alvo local <target name="fazer-isto"> <antcall target="fazer"> <param name="oque" value="isto" /> </antcall> </target> Define propriedade que será lida no outro build.xml <target name="fazer-aquilo"> <antcall target="fazer"> <param name="oque" value="aquilo" /> </antcall> </target> <target name="fazer" if="oque"> <tarefa atributo="${oque}" /> </target> Template! 52
  • 53. 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 Framework Exemplo: argonavis.com.br No exemplo abaixo, o som festa.wav será tocado quando o build terminar sem erros fatais. vaia.wav tocará 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> 53
  • 54. Extensão usando XML Como o buildfile é um arquivo XML, pode-se incluir trechos de XML externos através do uso de entidades externas argonavis.com.br sound.xml <property file="sound.properties" /> <property file="sound.properties" /> <sound> <sound> <success source="${success.sound}"/> <success source="${success.sound}"/> <fail source="${fail.sound}"/> <fail source="${fail.sound}"/> </sound> </sound> <?xml version="1.0" encoding="iso-8859-1" ?> <?xml version="1.0" encoding="iso-8859-1" ?> <!DOCTYPE project [ <!DOCTYPE project [ <!ENTITY sound SYSTEM "sound.xml"> <!ENTITY sound SYSTEM "sound.xml"> ]> ]> <project default="dtd"> <project default="dtd"> <description>Gera um DTD para o Ant</description> <description>Gera um DTD para o Ant</description> <target name="init"> <target name="init"> &sound; &sound; </target> </target> <target name="dtd" depends="init"> <target name="dtd" depends="init"> <antstructure output="ant.dtd" /> <antstructure output="ant.dtd" /> </target> </target> </project> </project> 54
  • 55. Integração com outras aplicações Ant 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. Eventos argonavis.com.br Build iniciou/terminou Alvo iniciou/terminou Tarefa iniciou/terminou Mensagens logadas Vários listeners e loggers pré-definidos Pode-se usar ou estender classe existente. Para gravar processo (build) em XML: > ant -listener org.apache.tools.ant.XmlLogger 55
  • 56. Integração com editores e IDEs Produtos 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 Java http://ant.netbeans.org/ Eclipse argonavis.com.br http://eclipse.org JEdit (AntFarm plug-in) http://www.jedit.org Jext (AntWork plug-in) ftp://jext.sourceforge.net/pub/jext/plugins/AntWork.zip 56
  • 57. Integração com o JEdit Tela do AntFarm mostra alvos do Ant. Pode-se clicar sobre o alvo para executá-lo argonavis.com.br Resultados são mostrados no Console do JEdit 57
  • 58. 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 argonavis.com.br 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/. 58
  • 59. Curso J820 Produtividade e Qualidade em Java: Ferramentas e Metodologias Revisão 1.1 © 2002, 2003, Helder da Rocha (helder@acm.org) argonavis.com.br