J820. Ambiente de Desenvolvimento Java usando. Ant. Ant. argonavis.com.br. Helder da Rocha (helder@acm.org)



Documentos relacionados
Introdução ao Apache Ant

Java 2 Enterprise Edition. Introdução ao. Apache Ant. Helder da Rocha

São Paulo Maio de argonavis.com.br. Construção de aplicações. Java com o. Java. Apache Ant. Helder da Rocha

Java 2 Standard Edition. Gerenciamento de projetos com o. Apache Ant. argonavis.com.br. Helder da Rocha (helder@acm.org)

Apache Ant. Leonardo Gresta Paulino Murta

J820. Integração Contínua. com CVS, CruiseControl, Cruise Control. argonavis.com.br. AntHill Gump e Helder da Rocha (helder@acm.

Java 2 Enterprise Edition Componentes Web J2EE

J820. Testes de interface Web com. HttpUnit. argonavis.com.br. Helder da Rocha

J820. Introdução ao. Apache Ant. argonavis.com.br. Helder da Rocha

O nome ANT é uma sigla para another neat tool (mais uma ferramenta organizada), segundo seu autor James Duncan Davidson.

Desenvolvimento Flex com Maven

J550 Tag Libraries e JSTL

Introdução. Tutorial do Xdoclet. Resumo

Universidade da Beira Interior

J550. Apache Struts. Helder da Rocha

Integração do Java + Adobe Flex através do Projeto BlazeDs

INTRODUÇÃO À TECNOLOGIA SERVLETS


Tutorial RMI (Remote Method Invocation) por Alabê Duarte

2 Orientação a objetos na prática

Instalação do Plugin LeJOS

Java 2 Standard Edition. Configuraçã. ção o do ambiente. JEdit + Ant. argonavis.com.br. Helder da Rocha (helder@acm.org)

CURSO DE PROGRAMAÇÃO EM JAVA

Documentação Usando o Javadoc

Java 2 Standard Edition. Fundamentos de. Objetos Remotos. Helder da Rocha

Internet e Programação Web

Como usar a documentaçã

Prática Sobre Servlets e JSP

J550 Testes em Aplicações Web com Cactus

Lista de operadores de comparação - > Maior que - < Menor que - <= Menor ou igual a - >= Maior ou igual a - === Igual a -!

O nome ANT é uma sigla para another neat tool (mais uma ferramenta organizada), segundo seu autor James Duncan Davidson.

Criação de um novo projeto no Eclipse utilizando Maven

Como criar um EJB. Criando um projeto EJB com um cliente WEB no Eclipse

Algoritmos e Estrutura de Dados. Introdução a Linguagem Python (Parte I) Prof. Tiago A. E. Ferreira

Guia de Consulta Rápida. PHP com XML. Juliano Niederauer. Terceira Edição. Novatec

Reuso com Herança a e Composiçã

Prática em Laboratório N.02 Criando um serviço Web via NetBeans

Trabalho Prático Script de Teste Automático

JavaScript 2.0X X

JSP: JAVA SERVER PAGES

Java II. Sérgio Luiz Ruivace Cerqueira

Java 2 Standard Edition Como criar classes e objetos

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

SCE-557. Técnicas de Programação para WEB. Rodrigo Fernandes de Mello

Web Services. Autor: Rômulo Rosa Furtado

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

Organizando Classes em Pacotes. Profa. Thienne Johnson EACH/USP

Programação WEB. Prof. André Gustavo Duarte de Almeida docente.ifrn.edu.br/andrealmeida. Aula III Introdução PHP

Manual de Utilização da Biblioteca VisPublica

Exercícios de Revisão Java Básico

Java 2 Enterprise Edition Session Beans

Introdução à Plataforma Eclipse. Leandro Daflon

DIRETÓRIOS. Diretórios ZIM. Estabelecer um diretório de aplicativo. Campos do objeto Diretórios. Diretórios estrangeiros. Zim 8.

J550. Model View Controller

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP

Java Básico. Aula 1 por Thalles Cezar

Curso de Linguagem Java

Aula 1 Acesso a Banco de Dados

Guião de Introdução ao Eclipse IDE Índice

Builds com Gradle: programativo e declarativo. Conheça a ferramenta de build para a JVM que está ganhando muita popularidade.

DWR DIRECTED WEB REMOTING

TUTORIAL DE INTRODUÇÃO AO CEWOLF

INTRODUÇÃO AO JAVA PARA PROGRAMADORES C

Instalando e configurando o Java Development Kit (JDK)

Leonardo Gresta Paulino Murta

Linguagem Java. Arquitetura e Ambiente de Desenvolvimento. Arquitetura e Ambiente de Desenvolvimento Prof. Anderson Augustinho Uniandrade

Tutorial Eclipse (IDE)

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

SCC Técnicas de Programação para WEB. Rodrigo Fernandes de Mello

Sistemas Distribuídos Métodos de Invocação Remota II. Prof. MSc. Hugo Souza

CONVENÇÃO DE CÓDIGO JAVA

Fundamentos da Plataforma Java EE. Prof. Fellipe Aleixo

O código JavaScript deve ser colocado entre tags de comentário para ficar escondido no caso de navegadores antigos que não reconhecem a linguagem.

Programação de Computadores - I. Profª Beatriz Profº Israel

Fundamentos de Programação II. Introdução à linguagem de programação C++

Sistemas Distribuídos Métodos de Invocação Remota IV. Prof. MSc. Hugo Souza

Testes de Software. Anne Caroline O. Rocha TesterCertified BSTQB NTI UFPB. Anne Caroline O. Rocha Tester Certified BSTQB NTI UFPB

Programação online em Java

Laboratório EJB e J2EE Uma aplicação completa

Programação Web. Professor: Diego Oliveira. Conteúdo 02: JSP e Servlets

Introdução a Java. Hélder Nunes

Desenvolvendo Websites com PHP

Integrando Flex + Java + BlazeDS

Prática da Disciplina de Sistemas Distribuídos Serviços Web IFMA DAI Professor Mauro Lopes C. Silva

Java 2 Enterprise Edition Uma aplicação J2EE completa

Capítulo 4. Packages e interfaces

Métodos Computacionais. Árvores

public Agenda() { compromissos = null; } public int getnumerodecompromissos() { if (compromissos==null) return 0; else return compromissos.

Manual introdutório do Apache ANT

Manual da Aplicação Water Monitor

Integração contínua com Hudson - Configuração, Extensão e Diversão! Fabiane Bizinella Nardon fabiane.nardon@zilics.com.br Zilics

Microsoft Access XP Módulo Um

O que é o JavaScript?

Curso de Aprendizado Industrial Desenvolvedor WEB

Transcrição:

J820 Ambiente de Desenvolvimento Java usando Ant Ant Helder da Rocha (helder@acm.org)

Como gerenciar projetos com o Ant Crie um diretório para armazenar seu projeto. Guarde na sua raiz o seu build.xml Use um arquivo build.properties para definir propriedades exclusivas do seu projeto (assim você consegue reutilizar o mesmo build.xml em outros projetos). Importe-o com <property file="build.properties" /> Dentro desse diretório, crie alguns subdiretó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 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 <project default="compile" name="minied"> <property file="build.properties"/> <target name="init"> <mkdir dir="${build.dir}"/> <mkdir dir="${dist.dir}"/> <target name="clean">... <target name="compile" depends="init">... <target name="build" depends="compile">... <target name="javadoc" depends="build">... <target name="run" depends="build">... </project> build.xml Estrutura dos arquivos (antes de executar o Ant) # 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.properties 4

Buildfile: aplicação gráfica executável <project default="compile" name="minied"> <property file="build.properties"/> <target name="compile" depends="init"> <javac destdir="classes" srcdir="src"> <classpath> <pathelement location="classes"/> </classpath> </javac> <target 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 name="run" depends="build"> <java jar="release/${app.name}.jar" fork="true" /> </project> Definindo o JAR com atributo Main-class para torná-lo executável # 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

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 name="buildrmi" depends="compile"> <rmic idl="true" iiop="true" base="classes"> <include name="**/rmiop/**impl.class" /> <include name="**/portable/**impl.class" /> </rmic> <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 name="orbd"> <exec executable="${java.home}\bin\orbd"> <arg line="-orbinitialport 1900 -ORBInitialHost ${host}"/> </exec> </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 name="war" depends="compile"> <war warfile="release/${context}.war" webxml="etc/web.xml"> <fileset dir="web" /> <classes dir="classes" /> </war> <target name="deploy" depends="war"> <copy todir="${deploy.dir}"> <fileset dir="release"> <include name="*.war" /> </fileset> </copy> </project> # Localizacao do Servidor tomcat.home=/tomcat-4.0 # 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 build.properties 7

Buildfile: aplicação EJB <project name="aplicação EJB" default="deploy"> build.xml <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 name="deploy" depends="build"> <copy todir="${deploy.dir}" file="release/${app.name}.jar" /> <target name="undeploy" depends="build"> <delete file="${deploy.dir}/${app.name}.jar" /> </project> # Localizacao do Servidor jboss.home=/jboss-3.0.0 # Altere para informar dir de instalacao deploy.dir=${jboss.home}/server/default/deploy # Coloque aqui nome da aplicação app.name=forumejb build.properties 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> </taskdef> <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 name="many2pdf" depends="many2fo"> <fop in="all.fo" out="all.pdf" /> <target name="html" depends="init"> <style basedir="dados" destdir="html" extension=".html" style="tohtml.xsl" /> </project> Mescla vários XML em um único XML maior e converte em XSL-FO Converte XSL-FO em PDF Converte vários XML em HTML 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 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

Cria 10 diretórios pasta1, pasta2, etc. em pastas/ <project name="scriptdemo" default="makedirs" > Exemplo de script <property name="result.dir" value="pastas" /> <target name="setup-makedirs"> Obtém referência para objeto <mkdir dir="${result.dir}" /> que implementa tarefa mkdir <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 name="makedirs" depends="setup-makedirs" /> </project> 11

import org.apache.tools.ant.*; public class ChangeCaseTask extends Task { } public static final int UPPERCASE = 1; private String message; private int strcase = 0; Exemplo de definição de tarefas (1) public void execute() { log( getmessage() ); } public void setmessage(string message) { this.message = message; } public void setcase(string strcase) { if (strcase.tolowercase().equals("uppercase")) this.strcase = UPPERCASE; else if (strcase.tolowercase().equals("lowercase")) this.strcase = -UPPERCASE; } public String getmessage() { switch(strcase) { case UPPERCASE: return message.touppercase(); case -UPPERCASE: return message.tolowercase(); default: return message; } } <target name="define-task" depends="init"> <taskdef name="changecase" classname="changecasetask"> <classpath> <pathelement location="tasks.jar" /> </classpath> </taskdef> <target 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" /> 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) 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 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) src <javac> *.java *Test.java AllTests.java *.properties classes *.class *.properties <copy> lib/jars commons-*.jar struts.jar jaxb-rt-*.jar web webinf *.tld struts-*.xml web.xml hellojsp-struts.jar 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 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)