SlideShare uma empresa Scribd logo
J820

Ambiente de
Desenvolvimento Java
usando

Ant

Helder da Rocha (helder@acm.org)

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

argonavis.com.br

Dentro desse diretório, crie alguns subdiretórios
src/
lib/
doc/
etc/
web/

Para armazenar o código-fonte
Opcional. Para guardar os JARs de APIs usadas
Opcional. Para guardar a documentação gerada
Opcional. Para arquivos de configuração se houver
Em projetos Web, para raiz de documentos do site

O seu Ant script deve ainda criar durante a execução
build/
dist/

Ou classes/. Onde estará o código compilado
Ou jars/ ou release/. Onde estarão JARs criados

2
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

argonavis.com.br

init
clean
compile
build
run
test
deploy

Para criar dietórios, inicializar o ambiente, etc.
Para fazer a faxina, remover diretórios gerados, etc.
Para compilar
Para construir a aplicação, integrar, criar JARs
Para executar um cliente da aplicação
Para executar os testes da aplicação
Para implantar componentes Web e EJB

Você pode usar outros nomes, mas mantenha um padrão
Também pode criar uma nomenclatura que destaque alvos
principais, usando maiúsculas. Ex:
CLEAN, chamando clean-isto, clean-aquilo, undeploy, etc.
BUILD, que chama build-depend, build-client, build-server
3
Exemplo de projeto

argonavis.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ção
app.name=minied
# Nomes dos diretórios
src.dir=src
docs.dir=docs
build.dir=classes
dist.dir=jars
# Nome da classe executável
app.main.class=com.javamagazine.minied.MiniEditor
root.package=com

build.xml
Estrutura dos
arquivos (antes
de executar o Ant)

build.properties

4
Buildfile: aplicação gráfica executável
<project default="compile" name="MiniEd">
<property file="build.properties"/>

argonavis.com.br

<target name="compile" depends="init">
<javac destdir="classes" srcdir="src">
<classpath>
<pathelement location="classes"/>
</classpath>
</javac>
</target>

Definindo o JAR com
atributo Main-class para
torná-lo executável

<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 JAR
app.name=minied
# Nome da classe executável
app.main.class=com.javamagazine.minied.MiniEditor

5
argonavis.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}binorbd">
<arg line="-ORBInitialPort 1900 -ORBInitialHost ${host}"/>
</exec>
</target>
</project>

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

build.xml

<property file="build.properties" /> <!-- init e clean omitidos -->
<target name="compile" depends="init">
<javac srcdir="src" destdir="classes">
<classpath path="${servlet.jar}" />
</javac>
</target>

argonavis.com.br

<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>
# Localizacao do Servidor
</copy>
tomcat.home=/tomcat-4.0
</target>
</project>

build.properties

# Altere para informar dir de instalacao
deploy.dir=${tomcat.home}/webapps
# Coloque aqui nome do contexto
context=forum
# JAR com Servlet API
servlet.jar=${tomcat.home}/common/lib/servlet.jar

7
Buildfile: aplicação EJB
build.xml

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

argonavis.com.br

<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 Servidor
jboss.home=/jboss-3.0.0

build.properties

# Altere para informar dir de instalacao
deploy.dir=${jboss.home}/server/default/deploy
# Coloque aqui nome da aplicação
app.name=forumejb

8
Buildfile: transformação XSL
<project name="foptask-example" default="pdf">
<target name="setup" depends="check">
<taskdef name="fop" classname="argonavis.pdf.FopTask">
<classpath> ... </classpath>
Mescla vários XML em um único
</taskdef>
</target>
XML maior e converte em XSL-FO
<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>

argonavis.com.br

Converte XSL-FO em PDF

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

vários XML em HTML

<target name="html" depends="init">
<style basedir="dados" destdir="html"
extension=".html" style="toHtml.xsl" />
</target>
</project>

9
Ant programável
Há duas formas de estender o Ant com novas funções
Implementar roteiros usando JavaScript
Criar novas tarefas reutilizáveis

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

argonavis.com.br

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

A tarefa <taskdef> permite definir novas tarefas
Tarefa deve ser implementada em Java e estender Task
Método execute() contém código de ação da tarefa
Cada atributo corresponde a um método setXXX()
10
Exemplo de script
Cria 10 diretórios pasta1, pasta2, etc. em pastas/
<project name="scriptdemo" default="makedirs" >

argonavis.com.br

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

Obtém referência para objeto
<target name="setup-makedirs">
que implementa tarefa mkdir
<mkdir dir="${result.dir}" />
<script language="javascript"><![CDATA[
for (i = 0; i < 10; i++) {
criadir = scriptdemo.createTask("mkdir");
// Obter propriedade ${result.dir} deste projeto
root = scriptdemo.getProperty("result.dir");
// Definir diretorio a criar
criadir.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>

11
Exemplo de definição de tarefas (1)
import org.apache.tools.ant.*;
public class ChangeCaseTask extends Task {

argonavis.com.br

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

}

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

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

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)

12
Conclusões
Ant é uma ferramenta indispensável em qualquer
projeto de desenvolvimento Java
Permite automatizar todo o desenvolvimento
Facilita a montagem da aplicação por outras pessoas
Ajuda 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)
argonavis.com.br

Use o Ant em todos os seus projetos
Crie sempre um projeto e um buildfile, por mais simples
que seja a sua aplicação
Escreva buildfiles que possam ser reutilizados
Desenvolva o hábito de sempre usar o Ant
13
Exercício
1. Monte um buildfile simples para a aplicação
MiniEd.jar. Use o build.xml e build.properties fornecidos
(com comentários). Implemente alvos para

argonavis.com.br

Compilar a aplicação
Montar a aplicação como um JAR executável
Gerar JavaDocs da aplicação e colocá-los em um ZIP
Executar a aplicação
Observações: (a) use <exclude> patternsets para não compilar as
classes que terminarem em *Test.java.
(b) Inclua a pasta icons/ no CLASSPATH (raiz do JAR)

2. (opcional) Monte um build.xml para construir um
WAR para a aplicação Web fornecida
Veja desenho na próxima página (observe os excludes)
14
Exercicio 2 (diagrama)
lib/jars

classes
src

<javac>

*.java
*Test.java
AllTests.java
*.properties

*.class
*.properties

commons-*.jar
struts.jar
jaxb-rt-*.jar

<copy>
web

webinf
*.tld
struts-*.xml
web.xml

hellojsp-struts.jar

argonavis.com.br

WEB-INF
classes

lib

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

16
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

Mais conteúdo relacionado

PDF
Java 08
PPT
Curso de Introdução - PHP Zend Framework
PDF
Rafael Garcia - Yii Framework, principais características e em ação
PDF
RubyConfBr 2015 - Rails & Javascript: faça isso direito
PDF
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
KEY
Python 07
PDF
Introdução à MEAN Stack
PDF
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Java 08
Curso de Introdução - PHP Zend Framework
Rafael Garcia - Yii Framework, principais características e em ação
RubyConfBr 2015 - Rails & Javascript: faça isso direito
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Python 07
Introdução à MEAN Stack
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)

Mais procurados (20)

PDF
TDC 2015 - Rails & Javascript: faça isso direito
PDF
API de segurança do Java EE 8
PDF
Minicurso de Segurança em Java EE 7
PDF
Curso de Java Persistence API (JPA) (Java EE 7)
PDF
Uma abordagem ao Java EE 6
PPTX
PHP robusto com Zend Framework
PDF
Hibernate efetivo (IA-2014 / Disturbing the Mind)
PDF
Javascript no SAPO e libsapojs
PDF
Zend Framework 1.11
PDF
Apresentando o Yii Framework
KEY
Python 08
PPTX
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
PDF
A arquitetura modular do Java 9
PDF
Ruby On Rails Regis
PPTX
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
PDF
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
PDF
Hibernate efetivo (COALTI-2014 / ALJUG)
PDF
Desenvolvimento Web com Simfony Framework.
PDF
Django Módulo Básico Parte II
PPTX
Framework Yii
TDC 2015 - Rails & Javascript: faça isso direito
API de segurança do Java EE 8
Minicurso de Segurança em Java EE 7
Curso de Java Persistence API (JPA) (Java EE 7)
Uma abordagem ao Java EE 6
PHP robusto com Zend Framework
Hibernate efetivo (IA-2014 / Disturbing the Mind)
Javascript no SAPO e libsapojs
Zend Framework 1.11
Apresentando o Yii Framework
Python 08
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
A arquitetura modular do Java 9
Ruby On Rails Regis
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Hibernate efetivo (COALTI-2014 / ALJUG)
Desenvolvimento Web com Simfony Framework.
Django Módulo Básico Parte II
Framework Yii
Anúncio

Destaque (8)

DOC
Glosario1 7
DOCX
Presupuesto de vicente condori quepi
DOCX
Letrero curso
PDF
Blackjackets
PDF
Company Profile[1]
DOCX
Ofic. apoyo p movilidad
DOCX
óRgano resolutivo de procedimientos sumarísimos
PPTX
5 minute card
Glosario1 7
Presupuesto de vicente condori quepi
Letrero curso
Blackjackets
Company Profile[1]
Ofic. apoyo p movilidad
óRgano resolutivo de procedimientos sumarísimos
5 minute card
Anúncio

Semelhante a Ambiente de Desenvolvimento Java usando Ant (20)

PDF
Gerenciamento de projetos com o Apache Ant
PDF
Gerenciamento de projetos com o Apache Ant
PDF
Introdução ao Apache Ant
PDF
PDF
Precisamos falar sobre Gradle
ODP
TDC 2014 SP - E o DeltaSpike ?
KEY
Build Automation Evolved
PDF
Programando para programadores: Desafios na evolução de um Framework
PDF
Aplicacoes Rapidas Para Web Com Django
PPT
Maverick v1.0
PDF
Introdução ao Zend Framework 2
ODP
GlassFish e Maven: Java EE sem dor!
PDF
Analise frameworks php
PDF
Dockerizando aplicações em uma Fintech
PDF
CDI Extensions e DeltaSpike
PPT
Java Seminar
PPTX
PDC - Engenharia - Plataforma Microsoft .NET
PPTX
TechDay - Sistemas WEB em Java - Rogério N. Jr.
PDF
Como Perder Peso (no browser)
PDF
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
Introdução ao Apache Ant
Precisamos falar sobre Gradle
TDC 2014 SP - E o DeltaSpike ?
Build Automation Evolved
Programando para programadores: Desafios na evolução de um Framework
Aplicacoes Rapidas Para Web Com Django
Maverick v1.0
Introdução ao Zend Framework 2
GlassFish e Maven: Java EE sem dor!
Analise frameworks php
Dockerizando aplicações em uma Fintech
CDI Extensions e DeltaSpike
Java Seminar
PDC - Engenharia - Plataforma Microsoft .NET
TechDay - Sistemas WEB em Java - Rogério N. Jr.
Como Perder Peso (no browser)
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS

Mais de Denis L Presciliano (20)

PDF
Funmentos de Objetos Remotos
PDF
Fundamentos de JDBC
PDF
Como construir aplicações gráficas e applets
PDF
Classes internas
PDF
Entrada e Saída
PDF
Coleções Propriedade, Resources e Strings
PDF
Funcamentos de Programação Concorrente
PDF
Testes de Unidade com JUnit
PDF
Erros, exceções e asserções
PDF
Interfaces e Porlimosfismo
PDF
Reuso com Herança e Composição
PDF
Pacotes e Encapsulamento
PDF
Como criar classes e objetos
PDF
Tipos, literais, operadoes e controle de fluxo
PDF
Como usar a documentação da API Java 2
PDF
Configuração do ambiente JEdit + Ant
PDF
Programação Orientada a objetos em Java
PDF
Introdução a tecnologia Java
PDF
Fundamentos de Sockets
PDF
J530 15 workshop
Funmentos de Objetos Remotos
Fundamentos de JDBC
Como construir aplicações gráficas e applets
Classes internas
Entrada e Saída
Coleções Propriedade, Resources e Strings
Funcamentos de Programação Concorrente
Testes de Unidade com JUnit
Erros, exceções e asserções
Interfaces e Porlimosfismo
Reuso com Herança e Composição
Pacotes e Encapsulamento
Como criar classes e objetos
Tipos, literais, operadoes e controle de fluxo
Como usar a documentação da API Java 2
Configuração do ambiente JEdit + Ant
Programação Orientada a objetos em Java
Introdução a tecnologia Java
Fundamentos de Sockets
J530 15 workshop

Último (20)

PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PPTX
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
PPTX
Curso de Java 9 - (Threads) Multitarefas.pptx
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx
PPTX
Curso de Java 15 - (Uso de Servlets (Entendendo a Estrutura)).pptx
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
Processos na gestão de transportes, TM100 Col18
PPTX
Émile Durkheim slide elaborado muito bom
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Aula 18 - Manipulacao De Arquivos python
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PPTX
Curso de Java 14 - (Explicações Adicionais (Classes Abstrata e Interface)).pptx
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Custos e liquidação no SAP Transportation Management, TM130 Col18
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
Curso de Java 9 - (Threads) Multitarefas.pptx
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx
Curso de Java 15 - (Uso de Servlets (Entendendo a Estrutura)).pptx
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Processos na gestão de transportes, TM100 Col18
Émile Durkheim slide elaborado muito bom
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Apple Pippin Uma breve introdução. - David Glotz
Aula 18 - Manipulacao De Arquivos python
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Curso de Java 14 - (Explicações Adicionais (Classes Abstrata e Interface)).pptx

Ambiente de Desenvolvimento Java usando Ant

  • 1. J820 Ambiente de Desenvolvimento Java usando Ant Helder da Rocha (helder@acm.org) argonavis.com.br
  • 2. 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" /> argonavis.com.br Dentro desse diretório, crie alguns subdiretórios src/ lib/ doc/ etc/ web/ Para armazenar o código-fonte Opcional. Para guardar os JARs de APIs usadas Opcional. Para guardar a documentação gerada Opcional. Para arquivos de configuração se houver Em projetos Web, para raiz de documentos do site O seu Ant script deve ainda criar durante a execução build/ dist/ Ou classes/. Onde estará o código compilado Ou jars/ ou release/. Onde estarão JARs criados 2
  • 3. 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 argonavis.com.br init clean compile build run test deploy Para criar dietórios, inicializar o ambiente, etc. Para fazer a faxina, remover diretórios gerados, etc. Para compilar Para construir a aplicação, integrar, criar JARs Para executar um cliente da aplicação Para executar os testes da aplicação Para implantar componentes Web e EJB Você pode usar outros nomes, mas mantenha um padrão Também pode criar uma nomenclatura que destaque alvos principais, usando maiúsculas. Ex: CLEAN, chamando clean-isto, clean-aquilo, undeploy, etc. BUILD, que chama build-depend, build-client, build-server 3
  • 4. Exemplo de projeto argonavis.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ção app.name=minied # Nomes dos diretórios src.dir=src docs.dir=docs build.dir=classes dist.dir=jars # Nome da classe executável app.main.class=com.javamagazine.minied.MiniEditor root.package=com build.xml Estrutura dos arquivos (antes de executar o Ant) build.properties 4
  • 5. Buildfile: aplicação gráfica executável <project default="compile" name="MiniEd"> <property file="build.properties"/> argonavis.com.br <target name="compile" depends="init"> <javac destdir="classes" srcdir="src"> <classpath> <pathelement location="classes"/> </classpath> </javac> </target> Definindo o JAR com atributo Main-class para torná-lo executável <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 JAR app.name=minied # Nome da classe executável app.main.class=com.javamagazine.minied.MiniEditor 5
  • 6. argonavis.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}binorbd"> <arg line="-ORBInitialPort 1900 -ORBInitialHost ${host}"/> </exec> </target> </project> 6
  • 7. Buildfile: aplicação Web <project default="deploy" name="Aplicação Web"> build.xml <property file="build.properties" /> <!-- init e clean omitidos --> <target name="compile" depends="init"> <javac srcdir="src" destdir="classes"> <classpath path="${servlet.jar}" /> </javac> </target> argonavis.com.br <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> # Localizacao do Servidor </copy> tomcat.home=/tomcat-4.0 </target> </project> build.properties # Altere para informar dir de instalacao deploy.dir=${tomcat.home}/webapps # Coloque aqui nome do contexto context=forum # JAR com Servlet API servlet.jar=${tomcat.home}/common/lib/servlet.jar 7
  • 8. Buildfile: aplicação EJB build.xml <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> argonavis.com.br <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 Servidor jboss.home=/jboss-3.0.0 build.properties # Altere para informar dir de instalacao deploy.dir=${jboss.home}/server/default/deploy # Coloque aqui nome da aplicação app.name=forumejb 8
  • 9. Buildfile: transformação XSL <project name="foptask-example" default="pdf"> <target name="setup" depends="check"> <taskdef name="fop" classname="argonavis.pdf.FopTask"> <classpath> ... </classpath> Mescla vários XML em um único </taskdef> </target> XML maior e converte em XSL-FO <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> argonavis.com.br Converte XSL-FO em PDF <target name="many2pdf" depends="many2fo"> <fop in="all.fo" out="all.pdf" /> </target> Converte vários XML em HTML <target name="html" depends="init"> <style basedir="dados" destdir="html" extension=".html" style="toHtml.xsl" /> </target> </project> 9
  • 10. Ant programável Há duas formas de estender o Ant com novas funções Implementar roteiros usando JavaScript Criar novas tarefas reutilizáveis A tarefa <script> permite embutir JavaScript em um buildfile. Pode-se argonavis.com.br Realizar operações aritméticas e booleanas Utilizar estruturas como if/else, for, foreach e while Manipular com os elementos do buildfile usando DOM A tarefa <taskdef> permite definir novas tarefas Tarefa deve ser implementada em Java e estender Task Método execute() contém código de ação da tarefa Cada atributo corresponde a um método setXXX() 10
  • 11. Exemplo de script Cria 10 diretórios pasta1, pasta2, etc. em pastas/ <project name="scriptdemo" default="makedirs" > argonavis.com.br <property name="result.dir" value="pastas" /> Obtém referência para objeto <target name="setup-makedirs"> que implementa tarefa mkdir <mkdir dir="${result.dir}" /> <script language="javascript"><![CDATA[ for (i = 0; i < 10; i++) { criadir = scriptdemo.createTask("mkdir"); // Obter propriedade ${result.dir} deste projeto root = scriptdemo.getProperty("result.dir"); // Definir diretorio a criar criadir.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> 11
  • 12. Exemplo de definição de tarefas (1) import org.apache.tools.ant.*; public class ChangeCaseTask extends Task { argonavis.com.br public static final int UPPERCASE = 1; private String message; private int strCase = 0; } <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> 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; } } 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) 12
  • 13. Conclusões Ant é uma ferramenta indispensável em qualquer projeto de desenvolvimento Java Permite automatizar todo o desenvolvimento Facilita a montagem da aplicação por outras pessoas Ajuda 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) argonavis.com.br Use o Ant em todos os seus projetos Crie sempre um projeto e um buildfile, por mais simples que seja a sua aplicação Escreva buildfiles que possam ser reutilizados Desenvolva o hábito de sempre usar o Ant 13
  • 14. Exercício 1. Monte um buildfile simples para a aplicação MiniEd.jar. Use o build.xml e build.properties fornecidos (com comentários). Implemente alvos para argonavis.com.br Compilar a aplicação Montar a aplicação como um JAR executável Gerar JavaDocs da aplicação e colocá-los em um ZIP Executar a aplicação Observações: (a) use <exclude> patternsets para não compilar as classes que terminarem em *Test.java. (b) Inclua a pasta icons/ no CLASSPATH (raiz do JAR) 2. (opcional) Monte um build.xml para construir um WAR para a aplicação Web fornecida Veja desenho na próxima página (observe os excludes) 14
  • 16. 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/. 16
  • 17. 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