Maven User Guide

http://hotwork.sourceforge.net/hotwork/manual/maven/maven-user-guide.html 1. INTRODUÇÃO 1. INSTALAÇÃO E CONFIGURAÇÃO 2. EXEMPLO DE UTILIZAÇÃO 1. Criando um projeto simples com o Maven Application Generator Plug-in 2. Conceitos Básicos 3. Comandos Básicos 2. PROJECT OBJECT MODEL (POM) 1. PROCESSAMENTO DO POM 2. HERDANDO UM POM 3. PLUG-INS 1. MAVEN.XML 2. EXEMPLO 3. CUSTOMIZANDO O MAVEN ATRAVÉS DO MAVEN.XML 4. MAVEN SETUP 1. PLUG-IN PROPERTIES 2. BEHAVIORAL PROPERTIES 3. UTILIZANDO PROXIES 4. UTILIZANDO MÚLTIPLOS REPOSITÓRIOS REMOTOS 5. REMOTE REPOSITORY LAYOUT 6. PROJETOS J2EE COM MAVEN - EXEMPLO 1. PROJETO AGENDA ON-LINE 2. MASTER PROJECT 3. CONSTRUINDO O JAR DE SERVIÇO (JAVA MODULE) 4. CONSTRUINDO O WAR (WEB MODULE) 5. CONSTRUINDO O EAR 6. MAVEN MULTIPROJECT PLUG-IN 7. MAVEN SITE 1. CONFIGURAÇÕES 2. RELATÓRIOS 3. MAVEN XDOC PLUGIN 4. EXEMPLOS DE REPORTS 5. MÉTRICAS 8. TESTES 1. EXECUTANDO TESTES UNITÁRIOS 9. MAVENIDE 1. INSTALAÇÃO 2. CONFIGURAÇÕES 3. POM SYNCHRONIZATION 4. SOURCE DIRECTORY SYNCHRONIZATION 5. DEPENDENCY SYNCHRONIZATION

Sobre esse Tutorial
Néki Technologies. Agradecimentos ao Néki Team!

Introdução
"The intent of Maven is to make intra-project development highly manageable in the hopes of providing more time for cross-project development. You might call it cross-

project pollination or the sharing of project development knowledge; this is what Maven attempts to encourage" (Jason van Zyl) Com cadeira cativa em quase todos os projetos J2EE, a ferramenta de build ANT - que substitui ferramentas tradicionais como make, gnumake, nmake e jam - tornou-se de fato um padrão para a construção de aplicações Java. Originalmente parte do código base do TomCat, tornou-se independente, tendo sua primeira release gerada em Julho de 2000. Totalmente escrita em Java, multiplataforma, utiliza-se de um script escrito em XML, denominado build file, para descrever as tarefas que deverão ser realizadas para o projeto, como por exemplo, compilação, empacotamento (jar, war e ear), deployment, javadocs, integração com frameworks de teste, controladores de versão, entre outros. Porém, apesar de incontestável sua utilização, o ANT deixa a desejar quando se trata de gerenciamento do projeto como um todo. Examinando um script de build, fica impossível sabermos quais são as dependências do projeto, seus responsáveis, versão, entre outras metainformações do projeto. Maven vai além! Baseando-se no conceito de um Project Object Model (POM), todos os artefatos produzidos pelo Maven são resultantes de um modelo bem definido para o seu projeto. Em poucas linhas de descrição do projeto, pode-se facilmente realizar algumas tarefas padrão - compilação, empacotamento (jar, war, ear), deployment, entre outras sem que seja necessária a criação e/ou customização de scripts de build. Essa facilidade faz com que essa ferramenta seja cada vez mais incorporada não só aos projetos da Jakarta, mas também aos projetos corporativos. Bastante flexível, o ANT permite executar uma infinidade de tarefas para o projeto, porém pagasse um preço razoavelmente alto no desenvolvimento de uma quantidade significativa de linhas de código para a criação de scripts. Já com o Maven, despendesse um esforço na descrição do projeto, no entanto com a utilização de plug-ins, todo o "trabalho sujo" que deveria ser programado através de scripts, não será mais necessário. A restrição imposta pelo Maven para que você não precise programar scripts complexos, é a de gerar um artefato por projeto (entende-se projeto aquela pasta que contém o project.xml). Então, não poderemos gerar um EAR (Enterprise ARchieve) de um projeto, certo? A resposta é: errado! Um projeto pode conter subprojetos, que por sua vez geram seu artefato - jar e war. Como veremos adiante, o projeto principal ficará encarregado de juntar essas peças e colocá-las dentro de um EAR. Claro que todo esse trabalho é facilitado, através de plug-ins e herança. Quem já trabalhou em projetos corporativos utilizando o ANT, sabe o quão complexo se torna gerir todos os scripts criados, além é claro, da quantidade de scripts que realizam tarefas similares ou muitas vezes idênticas, construídos quase sempre através do famoso "Crtl+C, Crtl+V". O fato é que precisamos executar atividades que são de uma certa forma padrão, ou seja, precisamos compilar e empacotar classes, compartilhar bibliotecas, recursos, remover diretórios, arquivos, entre outros. O problema começa a ficar mais sério quando se perde o controle sobre quais são as dependências internas e externas - versões dos frameworks externos e módulos internos utilizados no projeto -, quando não existe nenhum procedimento de medição e análise de dados quantitativos para se obter informações objetivas quanto à qualidade

do produto em construção, possibilitando um controle preciso da evolução do projeto e principalmente quando o desenvolver balbucia aquela celebre frase: "mas isso funcionava na minha máquina!".

Instalação e Configuração
Atualmente o Maven é distribuído em vários formatos: um arquivo de instalação tar/gzipped, zip, exe, entre outros. Iremos utilizar aqui a release candidate 1 do maven 1.0 (maven-1.0-rc1.zip). Siga os passos abaixo:
1. Faça o download do arquivo maven-1.0-rc1.zip (veja links); 2. Crie a variável de ambiente MAVEN_HOME apontando para o diretório aonde maven foi descompactado; 3. Adicione a pasta $MAVEN_HOME/bin no seu PATH

Obs: Tenha certeza que o Java está instalado corretamente e a variável JAVA_HOME setada. Para ter certeza de que tudo foi instalado corretamente, vá até ao prompt de comando e digite maven -v. Se você vir o que segue abaixo, significa que a instalação foi um sucesso.
__ __ | \/ |__ Jakarta _ ___ | |\/| / _ \ V / -_) ' \ ~ intelligent projects ~ |_| |_\__,_|\_/\___|_||_| v. 1.0-rc1-SNAPSHOT

Exemplo de utilização Criando um projeto simples com o Maven Application Generator Plug-in
Uma boa forma de automatizar o processo de criação de um novo projeto utilizando o Maven é através do genapp plug-in (Maven Application Generator Plug-in http://maven.apache.org/reference/plugins/genapp/index.html). No prompt de comando, vá até um diretório aonde o projeto de exemplo possa ser criado e digite: maven -Dmaven.genapp.template.package=br.com.neki genapp. ENTER para as demais opções. Abaixo segue o output gerado pelo comando:
__ __ | \/ |__ Jakarta _ ___ | |\/| / _ \ V / -_) ' \ ~ intelligent projects ~ |_| |_\__,_|\_/\___|_||_| v. 1.0-rc1-SNAPSHOT

Enter a project template to use: [default] Please specify an id for your application: [app] Please specify a name for your application: [Example Application] [copy] Copying 1 file to <diretório do projeto>\src\java\com\neki [copy] Copying 3 files to <diretório do projeto>\src\test\com\neki

[copy] Copying 1 file to <diretório do projeto> [copy] Copying 2 files to <diretório do projeto> BUILD SUCCESSFUL Total time: 5 seconds
Listagem 1 - Output de criação do projeto utilizando o Maven Application Generator Plugin

No final será criada uma estrutura como a que segue abaixo:

Figura 1 - Organização de um projeto simples utilizando o Maven

Conceitos Básicos
Antes de executar os comandos básicos, serão apresentados alguns conceitos importantes utilizados pelo Maven. O principal deles é o projeto. No "mundo Maven" significa dizer: qualquer diretório que contenha um project.xml é um projeto e se esse, por sua vez, contiver sub-diretórios que possuam seu project.xml, eles também serão considerados projetos. O repositório remoto, que dentre outras coisas, elimina completamente a necessidade de armazenamento de arquivos jars no CVS, é um outro conceito importante. Através da análise das dependências descritas para o projeto, o Maven irá se encarregar de efetuar automaticamente o download dos artefatos de um ou mais repositórios remotos. Quando trazidos, eles serão armazenados no repositório local, criado em um diretório chamado ".maven/repository", que quando não especificada sua localização, ficará no ${user.home}. Em uma máquina Windows isso seria o equivalente a C:\Documents And Settings\${nome_do_usuário}. Abaixo segue a esquematização do processo:

Esquematização do processo de build do Maven É importante salientar que na seqüência serão apresentados em detalhes os elementos descritos acima.id}-${project. vai dar uma voltinha e em seguida continue a sua leitura. junitreport. vá até o prompt de comando na raiz do projeto exemplo. Portanto.Comandos básicos do Maven Nota Importante: Antes de você brigar comigo. formas de configurar a localização dos repositórios e como descrever as dependências do projeto.jar. checkstyle. não fique irritado com isso. javadoc. xdoc. Comandos Básicos Para executar alguns comandos básicos em cima do projeto criado.xml Gera um site com a documentação do projeto: jdepend. tasklist. é bom avisar que na primeira vez que formos executar o Maven. no formato ${project. o site do projeto será criado no diretório: ${diretório do projeto}/target/docs.Figura 2 . changelog entre outros. //TODO maven site:generate maven clean maven -g Tabela 1 . ele irá baixar da net (repositório remoto) uma série de jars e plugins necessários a sua execução. Abaixo segue um exemplo de execução do comando maven jar:jar: __ __ .xml. Abaixo. O diretório dos arquivos fontes é definido através da target build do project.currentVersion}. segue um quadro explicativo com alguns comandos simples que poderão ser executados: Comando maven java:compile maven jar:jar Descrição Compila o código fonte do projeto. Remove os diretórios criados pelo Maven no processo de build. Tome um pouquinho de café. pois é só na primeira vez. Cria um arquivo jar para o projeto no diretório de build do Maven. Por default. onde o id e a currentVersion são definidos no project.

AppTest [junit] Tests run: 1.A Seção de Gerenciamento do Projeto entrará aqui --> 10 11 <!-. Os itens que aparecem em negrito são obrigatórios._|\_/\___|_||_| v. Uma divisão bastante interessante e didática pode ser feita quando se trata de explicar o POM.0.xml. informações gerenciais e localização dos arquivos fontes do projeto. Suas dependências. pode-se entender por POM (Project Object Model).0</currentVersion> 07 <name>Example Application</name> 08 09 <!-. Time elapsed: 0.05 sec jar:jar: [jar] Building jar: <diretório do projeto>\target\app-1.xml do projeto gerado pelo Maven Application Generator Plug-in. Overriding previous definition of reference to clover.| \/ |__ Jakarta _ ___ | |\/| / _ \ V / -_) ' \ ~ intelligent projects ~ |_| |_\__. 1. Utilizaremos como exemplo o project. Errors: 0. dependências. Podemos dividi-lo em quatro grandes seções: gerenciamento.classpath java:prepare-filesystem:java:compile: [echo] Compiling to <diretório do projeto>/target/classes java:jar-resources: Copying 1 file to <diretório do projeto>\target\classes test:prepare-filesystem: [mkdir] Created dir: <diretório do projeto>\target\test-classes [mkdir] Created dir: <diretório do projeto>\target\test-reports test:test-resources: test:compile: [javac] Compiling 3 source files to <diretório do projeto>\target\test-classes test:test: [junit] dir attribute ignored if running in the same VM [junit] Running com. o local onde serão definidas todas as informações acerca do projeto.0-rc1-SNAPSHOT Attempting to download maven-SNAPSHOT.A Seção de Dependências do Projeto entrará aqui --> .Output de execução da goal jar do Maven JAR Plugin PROJECT OBJECT MODEL (POM) Materializado pelo arquivo project. Failures: 0. construção e relatórios do projeto. 01 <?xml version="1. apresentado acima. são alguns dados que estarão contidos nesse arquivo.jar BUILD SUCCESSFUL Total time: 18 seconds Listagem 2 .neki.jar.0" encoding="ISO-8859-1"?> 02 <project> 03 04 <pomVersion>3</pomVersion> 05 <id>app</id> 06 <currentVersion>1. relatórios que deverão ser gerados.

Na Seção de Gerenciamento do Projeto. apesar de não ser diretamente utilizada.apache. O único elemento obrigatório é o nome da organização.A Seção de Construção do Projeto entrará aqui --> 14 15 <!-. que será apresentada em detalhes abaixo.org/</url> 04 <logo>http://maven.org/builds/ 22 </distributionDirectory> 23 24 <repository> 25 <connection> 26scm:cvs:pserver:anoncvs@cvs.apache. ou seja. tais como: detalhes da organização detentora do produto.apache. A linha 07 representa o nome dado ao projeto.org/reference/plugins/examples/</url> 13 <issueTrackingUrl> 14 http://nagoya.gif</logo> 05 </organization> 06 07 <inceptionYear>2002</inceptionYear> 08 <package>com. equipe.org</unsubscribe> 39 </mailingList> .apache. uma forma de herdar o POM.org:/home/cvspublic:maven/src/plugins27build/examples 28 </connection> 29 <url> 30 http://cvs.apache.apache.neki</package> 09 <logo>http://maven. lista de discussão. entre outras informações que também irão fazer parte do web site do projeto criado pelo Maven.apache.0. será apresentada uma maneira da organização ter um projeto-base que servirá como um template para que algumas informações não precisem ser reescritas a cada módulo.12 13 <!-.org/images/maven.apache. no caso acima: app-1.org/images/jakarta-logo-blue.org/reference/plugins/examples/ 19 </siteDirectory> 20 <distributionDirectory> 21 /www/maven.org/viewcvs/maven/src/plugins. pacote. data da criação.</description> 11 <shortDescription>. As linhas 05 e 06 definirão o nome do artefato que será armazenado no repositório local no momento da instalação do projeto ("${pomId}${pomCurrentVersion}. poderão estar descritas algumas informações importantes.Exemplo de um Project Object Model (POM) A linha 04..org</siteAddress> 17 <siteDirectory> 18 /www/maven. descreve a versão do POM e é obrigatória. Ainda nesse tutorial..apache.</shortDescription> 12 <url>http://maven.apache..jpg</logo> 10 <description>.apache. logotipo. descrição.A Seção de Relatórios do Projeto entrará aqui --> 16 17 </project> Listagem 3 .build/examples/ 31 </url> 32 </repository> 33 34 <mailingLists> 35 <mailingList> 36 <name>Maven User List</name> 37 <subscribe>users-subscribe@maven.apache.jar").org</subscribe> 38 <unsubscribe>users-unsubscribe@maven.org/scarab/servlet/scarab/ 15 </issueTrackingUrl> 16 <siteAddress>jakarta. como segue abaixo: 01 <organization> 02 <name>Apache Software Foundation</name> 03 <url>http://www.jar..

diretório de distribuição do artefato gerado pelo projeto.site onde o projeto está hospedado. Linhas 13 a 15 .pacote principal do projeto.localização da ferramenta de controle das atividades do projeto .java</include> </includes> <excludes> <exclude>**/NaughtyTest. o Maven irá compilar os arquivos Java e quando terminado.lista de discussão utilizada para debates a respeito do projeto.uma descrição sucinta do projeto.web site do projeto. pendências.diretório de publicação do site do projeto.apache.. Linha 08 . Linha 09 .cruz@neki-technologies.informações a respeito da equipe envolvida com o projeto. Linhas 20 a 22 . irá rodar os testes automaticamente. bugs etc. Nenhum item dessa seção é obrigatório.. Linha 11 . Linhas 34 a 42 . Linha 07 . Linha 16 .Seção de Construção do Projeto no POM .uma descrição um pouco mais detalhada a respeito do projeto... 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <build> <nagEmailAddress> turbine-maven-dev@jakarta.java</exclude> </excludes> </unitTest> <resources> <resource> <directory>src/conf</directory> <includes> <include>*. </mailingLists> <developers> <developer> <name>Fabiano Cruz</name> <id>fabianocruz</id> <email>fabiano.data de criação do projeto.br</email> </developer> <developers/> Listagem 4 . Linha 10 . Linhas 17 a 19 .org </nagEmailAddress> <sourceDirectory>src/java</sourceDirectory> <unitTestSourceDirectory>src/test</unitTestSourceDirectory> <unitTest> <includes> <include>**/*Test.requisitos.com. Linha 12 . Uma vez definidas as informações dessa seção. Linhas 24 a 32 .logotipo do projeto. . Linhas 44 a 50 .Seção de Gerenciamento do Projeto no POM • • • • • • • • • • • • • • Linhas 01 a 05 . a não definição fará com que o Maven ignore a existência de código fonte e testes no projeto. alterações.informações a respeito do controle de versão. A Seção de Construção do Projeto geralmente é definida no projeto-base e nela serão colocadas as informações relevantes à compilação e execução dos testes para o projeto.informações da organização. porém.properties</include> </includes> </resource> </resources> </build> Listagem 5 .40 41 42 43 44 45 46 47 48 49 50 .

Deve-se ter cuidado quando se estiver trabalhando off-line. No nosso caso.Diretório contendo os arquivos fontes do projeto. Linhas 12 a 14 .2. war. dada a riqueza das informações geradas.Endereço de e-mail para o envio de notificações a respeito do status da construção da aplicação. quando no término da compilação do projeto.Diretório contendo os testes unitários do projeto. Eles são uma ferramenta de apoio bastante eficiente na implantação de um processo de qualidade na organização. pois nela estarão descritas todas as dependências necessárias à compilação e execução do projeto. Uma vez descritas as dependências.8</version> 06 <type>jar</type> 07 </dependency> 08 <dependency> 09 <groupId>maven</groupId> 10 <artifactId>maven-findbugs-plugin</artifactId> 11 <version>SNAPSHOT</version> 12 <type>plugin</type> 13 </dependency> 14 </dependencies> Listagem 6 .Quando na tag version é colocada a palavra SNAPSHOT. o Maven irá procura-las no repositório local e quando não encontradas. Esses relatórios estarão concentrados no site do projeto criado pelo Maven.Arquivos que deverão ser adicionados ao artefato criado . plugin. os exemplos apresentados abaixo não estão no project. Linha 06 . Na Seção de Relatórios do Projeto estarão descritos os diferentes tipos de relatórios a serem gerados assim que o processo de build é terminado. o arquivo: log4j-1.xml do projeto exemplo. Os arquivos fontes poderão ser arquivos Java. porém os tipos ejb. Linha 11 . Quando não especificada a tag type. Não se preocupe com os detalhes dessa seção.8. As Seções de Dependências e Relatórios não são criadas pelo plug-in (Maven Application Generator Plug-in).jar.• • • • • • Linhas 02 a 04 . significa que o Maven sempre irá buscar a última versão daquele artefato. Linha 05 . Pode-se dizer que a Seção de Dependências do Projeto é umas das mais importantes dentro do POM.Nome padrão para os arquivos que deverão ser incluídos na execução dos testes.Arquivos que deverão ser excluídos dos testes Linhas 18 a 24 . a versão e o tipo de artefato requerido. pois você poderá estar com uma versão desatualizada no seu repositório local.Juntas irão descrever o nome.Diretório onde está o artefato (jar) descrito na seqüência. elas serão automaticamente baixadas. 01 <dependencies> 02 <dependency> 03 <groupId>log4j</groupId> 04 <artifactId>log4j</artifactId> 05 <version>1.2. será utilizado por default o arquivo do tipo jar. Linhas 09 a 11 .Seção de Dependências do Projeto no POM • • • Linha 03 . portanto. JSP etc.jar e war. Mais na frente serão apresentados alguns dos plug-ins descritos abaixo: 01 <reports> 02 <report>maven-jdepend-plugin</report> 03 <report>maven-pmd-plugin</report> 04 <report>maven-checkstyle-plugin</report> 05 <report>maven-simian-plugin</report> 06 <report>maven-findbugs-plugin</report> 07 <report>maven-changes-plugin</report> 08 <report>maven-changelog-plugin</report> 09 <report>maven-file-activity-plugin</report> . ear e tld também são suportados. Linhas 04. 05 e 06 .

Herdando um POM Abaixo. de repetição.artifactId}</package> <logo>/images/${pom.artifactId}. </description> <shortDescription> ${pom. ser estendido e/ou conter trechos programados.0-b5-dev</currentVersion> <organization> <name>Apache Software Foundation</name> <url>http://jakarta. o já familiar POM poderá dentre outras coisas.gif</logo> </organization> <inceptionYear>2001</inceptionYear> <package>org.org/</url> <logo>/images/jakarta-logo-blue. porém teremos o poder de trabalhar com estruturas condicionais.name} is a Java Project Management Tool </shortDescription> </project> Listagem 8 .Exemplo de utilização de scripts em Jelly As partes em negrito serão substituídas pelos valores descritos no POM. não precisaremos nos preocupar como funcionam scripts em Jelly.java</include> </includes> <excludes> .xml</extend> <id>super-extendo</id> <name>Super Extendo</name> <build> <unitTest> <includes> <include>**/*Test*. segue um exemplo de herança: <?xml version="1.0" encoding="ISO-8859-1"?> <project> <extend>project.10 <report>maven-developer-activity-plugin</report> 11 <report>maven-jxr-plugin</report> 12 <report>maven-junit-report-plugin</report> 13 <report>maven-jcoverage-plugin</report> 14 <report>maven-clover-plugin</report> 15 <report>maven-tasklist-plugin</report> 16 <report>maven-javadoc-plugin</report> 17 <report>maven-faq-plugin</report> 18 </reports> Listagem 7 . sobrescrever propriedades etc.inceptionYear}.Seção de Relatórios do Projeto no POM Processamento do POM Processado como um script Jelly.apache.apache.0" encoding="ISO-8859-1"?> <project> <pomVersion>3</pomVersion> <id>maven</id> <name>Maven</name> <currentVersion>1.jpg</logo> <description> Maven is a project that was created in ${pom. Abaixo. segue um exemplo: <?xml version="1. na grande maioria das vezes. Na verdade.${pom.

Any ant task. quando necessário. or jelly tags can go here thanks to jeez --> 08 <j:set var="goals" value="compile. simplesmente executando maven na linha de comando.o atributo default (default="nightly-build") definirá a goal que será executada quando nenhum parâmetro for passado pelo maven. portanto. ou seja. execução de testes. invocar outras goals.Exemplo de herança de um POM PLUG-INS Essa é a essência do Maven! São eles.apache.test" /> 09 <mkdir dir="${maven. poderá ser colocada dentro de um arquivo maven.build.java</exclude> <exclude>**/*Abstract*. os grandes responsáveis pelo sucesso dessa ferramenta. válida.Exemplo de um arquivo maven.">${goals}</u:tokenize> 11 <j:forEach items="${goals}" var="goal" indexVar="goalNumber"> 12 Now attaining goal number ${goalNumber}.elemento principal de todos os arquivos maven. Linha 02 .xml.xml • • Linha 01 . entre outros. Aqui. maven. criação de jar etc -. which is ${goal} 13 <attainGoal name="${goal}" /> 14 </j:forEach> 15 </goal> 16 </project> Listagem 10 .org/commons/sandbox/jelly/). apresentaremos um exemplo ilustrativo. qualquer tag Jelly. Um exemplo de maven.xml: 01 <project 02 default="nightly-build" 03 xmlns:j="jelly:core" 04 xmlns:u="jelly:util"> 05 06 <goal name="nightly-build"> 07 <!-.java</exclude> </excludes> </unitTest> </build> </project> Listagem 9 . .compilação. os PLUG-INS são extremamente poderosos e simples de serem desenvolvidos. Maven utiliza scripts escritos em uma linguagem denominada: Jelly ( http://jakarta.xml.dir}" /> 10 <u:tokenize var="goals" delim=".xml Esse é um arquivo 'especial' lido pelo Maven durante o processamento. Dedicados a trabalhos específicos .<exclude>**/TestAll. os PLUG-INS. criar uma goal. Exemplo Nota: Abaixo. você poderá sobrescrever goals e/ou criar um procedimento especial para o seu projeto copiar coisas. pois o Maven não define a goal 'compile' como default.

que diz ao Jelly que todos os elementos XML prefixados com j: são parte de uma tag library predefinida. Atributos: 1.Similar as targets do Ant.build. 2. sempre colocam como prefixo da goal o seu próprio nome.• • Linha 03 . .dir}. Essa função irá setar a variável. O Atributo var será setado com o valor na nova lista. O atributo items é uma expressão que irá conter a coleção a ser iterada.seguindo. a goal jar definida pelo plug-in para criar um arquivo jar para o seu projeto • • • Linha 08 . Por exemplo: jar:jar. No nosso exemplo: <j:set var="goals" value="compile. Por exemplo.xml deverá estar declarada no elemento project e ter um namespace definido. Linha 09 . cujo nome está definido no atributo var. O atributo indexVar conterá o nome da variável que irá receber o contador com o número de elementos a serem processados (zero-based).dir}"/>. O atributo delim é o delimitador utilizado para separar os itens da string. 3. setada algumas linhas acima. irá executar task mkdir do Ant. definido no elemento project. utilizando o namespace u:. temos as declarações de alguns XML namespaces. para executar a goal 'nightly-build'.<u:tokenize var="goals" delim=".build. basta passar o nome da goal parâmetro para o Maven na linha de comando. O atributo var especificará o nome da variável que receberá cada item da coleção durante o processamento 3. poderemos ter qualquer tag Jelly ou Ant. utilizando a tag werkz: attainGoal. Atributos: 1. criando o diretório especificado pela variável ${maven. as goals do Maven irão agrupar uma série de atividades a serem executadas. Essa tag agrupa as tag libraries Ant e werkz dentro de um namespace. definida no nosso exemplo. seja bastante simples. registrada com o identificador core dentro do Jelly. basta digitar: • > maven nightly-build Nota: 1. poderemos colocar qualquer tag Ant. com o valor colocado no atributo value. Qualquer tag library Jelly que você queira utilizar dentro do maven. que contém compile e test separados por vírgula.xmlns:u="jelly:util". invocaremos a função set da tag library core do Jelly. Linha 04 . invocaremos a função tokenize da tag library util do Jelly. Os plug-ins escritos para o Maven. por exemplo: xmlns:j="jelly:core". Nota: 1. encontramos a variável goals. 2. que diz ao Jelly que todos os elementos XML prefixados com u: são parte de uma tag library predefinida. 2. que o Maven utilize qualquer tag Ant ou werkz sem precisar definir um namespace. No corpo da tag tokenize. Dentro delas. que irá facilitar a vida quando o assunto é estrutura de repetição. registrada com o identificador util dentro do Jelly. Para executar uma goal definida no maven. definido elemento project.Dentro de cada goal. • Linha 06 .test"/> . fazendo com que o processo de migração de qualquer fragmento de script Ant. Linha 10 .">${goals}</u:tokenize>. temos o output de um texto que irá informar o nome da goal e o número a ser processado e invocará a goal. sendo fácil identificá-lo. Linha 11 a 14 .Aqui temos a função forEach: <j:forEach items="${goals}" var="goal" indexVar="goalNumber">. Isso permite. • Dentro da função.xml.<mkdir dir="${maven. O Maven já mantém pré-registrado a tag library jeez com um prefixo vazio. utilizando o namespace j:. como apresentado em Nota acima.

aqui definida como: foobar-dist. residente na mesma pasta do arquivo project.xml. cria um war e publica-o dentro do repositório.Exemplo de um arquivo maven.result. o WAR Plug-in precisa compilar arquivos Java antes de criar o arquivo WAR. do que a goal foobar-dist. podemos customizar as ações do Maven. Entretanto.Customizando o Maven através do maven. com pre e pos goals Acima. a preGoal irá executar um Maven Xdoclet Plug-in.properties ${user. Nesse caso. pre e post goals. A preGoal especificada está muito mais ligada a goal java:compile. a postGoal é especificada para a goal war:war.xml Até agora. Vimos também. 01 <project default="foobar-dist" xmlns:m="jelly:maven"> 02 03 <preGoal name="java:compile"> 04 <attainGoal name="xdoclet:webdoclet"/> 05 </preGoal> 06 07 <goal name="foobar-dist"> 08 <attainGoal name="war:install" /> 09 </goal> 10 11 <postGoal name="war:war"> 12 <mkdir dir="${test. que é executada antes da goal war:install.xml.dir}"/> 13 <echo>Creating directories</echo> 14 </postGoal> 15 16 </project> Listagem 11 . vimos como compilar classes Java utilizando o Maven e também criar arquivos jars. A goal default para esse projeto. além de goals.home}/build. Note que a preGoal (java:compile) é diferente da goal default (foobar-dist). Isso pode gerar alguma confusão às vezes.properties . como definir. MAVEN SETUP Os arquivos de propriedade utilizados pelo Maven são processados segundo a seguinte ordem: • • • ${project. colocamos um exemplo de maven.xml. Um postGoal pode ser especificado para qualquer goal implícita que seja parte da goal default ou a própria. A postGoal especifica que um dado diretório deve ser criado depois de construído o WAR. antes de executar a goal especificada no nome do atributo.home}/build.xml. Veremos agora. A goal foobar-dist é simplesmente um wrapper para uma outra goal denominada war:install.properties ${project. O elemento preGoal instrui o Maven a executar as tarefas definidas dentro dele. Repare a goal default do projeto. que através do arquivo maven. A goal "install" do Maven WAR Plug-in. A instrução "attainGoal" irá executar a goal descrita no atributo name. instala o arquivo war.home}/project. No exemplo.

você poderá sobrescrever qualquer propriedade default definida pelo plug-in. No mais. o Maven utiliza essa seqüência de arquivos de propriedades para sobrescrever qualquer propriedade definida anteriormente. utilizando a convenção: -Dproperty=value.home}/build. porém.class.properties.dir Descrição Diretório para aonde as classes geradas irá.build.home}/build. o plug-in CheckStyle passará a utilizar a convenção de código definida pelo Turbine. você poderá sobrescrever esse valor em qualquer um dos arquivos de propriedades. tem a palavra final na lista de arquivos de propriedades processados.home}/build. o plug-in CheckStyle. Portanto. uma vez que os Plug-ins são processados tardiamente no ciclo de inicialização. no arquivo: ${project. Isso funciona de forma oposta ao processamento normal das propriedades do Maven.dest maven. recebe a instrução de utilizar a convenção de código definida pela SUN.properties são processadas ${user. se você colocar o trecho.build. o PluginManager foi programado para não sobrescrever os valores que tiverem sido previamente setados.Onde a última definição vence. por exemplo: arquivos . Plug-in Properties Os Plug-ins são carregados depois de processada a seqüência de propriedades definidas acima. o plug-in CheckStyle define a propriedade default. que segue abaixo: maven.checkstyle.build. Portanto.properties são processadas Então. CUIDADO: Alterar o valor default da Valor Default ${maven. irá.format = turbine Behavioral Properties Abaixo.properties são processadas ${project. a tabela apresenta a lista de propriedades que altera a forma com que o Maven trabalha: Propriedade maven.format = sun Aqui.home}/project.checkstyle. documentação relatórios de testes unitários etc.properties. as propriedades de sistema serão processadas após a seqüência de arquivos. Diretório para aonde os outputs gerados. Seria algo do tipo: • • • • As propriedades default do Plug-in são processadas ${project.dir}/classes ${basedir}/target/ . segundo essa ordem. apresentados acima. descritos acima. Nessa seqüência.home}/project. as propriedades especificadas via CLI (commandline). Por exemplo. maven. o arquivo: ${user. como formato default. Mas. uma vez que os Plug-ins só poderão ser carregados depois que o kernel do Maven for inicializado. irão sobrescrever qualquer propriedade definida anteriormente. pela nova propriedade. que segue abaixo. Portanto.

docs.docs.enabled maven. O diretório de output dos html´s gerados dos relatórios. como por exemplo: informações expandidas de plug-ins e cache.home. O repositório na máquina local.conf.dir true ${maven.dir.org maven.gen.repo.docs O character enconding da documentação gerada.remote. são colocados.maven maven.build. O repositório que o Maven irá utilizar para baixar os artefatos (jars etc). O diretório aonde os xdocs.repo. pode permitir algum controle sobre a estrutura de diretório do projeto.executable true scp . Onde o Maven pode encontrar os plug-ins.src maven.build. O executável utilizado para cópias seguras.properties.dest Diretório para aonde arquivos fontes gerados irá. ${maven.home}/build. O diretório na máquina local utilizado pelo Maven para escrever detalhes específicos do usuário. durante um dist:deploy.home.mode. Esse é o diretório que o Maven irá copiar a distribuição.plugin. Se você está conectado a internet ou não. Porém.local}/plugins maven.repo.dir maven.build.build.home}/. O diretório que contém a documentação fornecida pelo usuário.repo.plugin.dir maven.ibiblio.build.docs.local maven. Se o repositório remoto deve ou não ser utilizado.org/maven maven. O diretório que armazena os arquivos de configuração.ibiblio.repo.outputencoding maven. que não forem encontrados na máquina local. Onde o Maven irá expandir os plugins a serem instalados para o processamento.propriedade maven.directory /public/html/maven maven.local ${maven. ISO-8859-1 ${basedir}/xdocs ${maven.remote http://www.0"?> maven. uma vez que ele espera que o jar criado para o projeto esteja em: ${basedir}/target/.dir}/src ${basedir}/conf ${maven.dir}/docs false maven. que o Maven irá utilizar para armazenar os artefatos baixados (jars etc). maven. Esse é o host que o Maven irá utilizar para fazer o deploy da distribuição.docs. por exemplo: <?xml version="1. essa prática interferirá com o bootstrap do Maven a partir do código fonte. que precisam ser transformados em html.home}/plugins ${maven.scp.dir}/generatedxdocs ${user.src maven.central. no seu ${user.central login.local}/repository maven.online maven. durante um dist:deploy.unpacked.omitXmlDeclaration Se a documentação gerada deve conter uma declaração xml.home.

Tabela 3 .executable O diretório base para o arquivos fontes.http://www.username maven. fazendo algo como o que segue abaixo: maven. o Maven irá obedecer as seguintes propriedades: Propriedade maven.ibiblio.proxy.Propriedade do Maven Utilizando Proxies Se você estiver atrás de um proxy. Abaixo.host = meu.repo.password = senha Utilizando Múltiplos Repositórios Remotos Você poderá especificar o uso de múltiplos repositórios remotos em qualquer um dos arquivos de propriedades processados pelo Maven.username = nomedousuario maven.src.com.proxy. . mas você poderá utilizar os seus repositórios remotos. desde que estejam de acordo com a estrutura apresentada nesse documento.properties ## ---------------------------------------------------------maven.org/maven/.Propriedade do Maven utilizando Proxies Se você precisa utilizar um proxy.com.home}/build.port = 8080 maven. ${basedir}/src scp Tabela 2 . onde os artefatos para o projeto poderão ser armazenados.ssh.remote = http://www.proxy. O número da porta do seu proxy. Todo projeto tem o seu próprio diretório no repositório. segue um exemplo: ## ---------------------------------------------------------## ${user.maven.proxy.host maven. o lugar mais apropriado para setar os valores dessas propriedades será no seu arquivo: ${user.proxy. simplesmente. O executável utilizado para executar comandos remotamente. caso o seu proxy requeira autenticação.br/maven/ REMOTE REPOSITORY LAYOUT O objetivo dessa seção é apresentar o layout do repositório remoto do Maven.properties.meusite. Cada projeto tem um id único e um diretório onde o mesmo. Senha.servidorproxy. caso o seu proxy requeira autenticação.br maven. Atualmente.home}/build. o repositório principal está hospedado no Ibiblio (http://www.port maven.org/maven/). irá armazenar seus artefatos nomeados após o id do projeto.ibiblio.password Descrição O endereço IP do seu proxy.proxy.proxy.dir maven. Nome do usuário.proxy.

O Maven desencoraja essa prática. Abaixo.2.jar Listagem 12 .jar | | |-.jar | | `-.Layout do Repositório Remoto PROJETOS J2EE COM MAVEN EXEMPLO Nas seções acima.jars | | |-. EJB-JARs.ojb-1.nomedoear-0.9-beta. Isso faz bastante sentido.nomedooutrojar-1. também poderão conter outros sub-projetos. monolítica. O projeto mais externo poderá ter múltiplos sub-projetos e esses por sua vez. Mas como somos bastante obedientes e gostamos muito do Maven. antes de qualquer coisa. plug-ins. . Iremos agora. quase sempre.3.seuprojeto | |-. WARs e EARs são criados utilizando diferentes scripts de build. maven. pudemos analisar o funcionamento básico do Maven.ojb | `-. No Maven.jar `-.jar | | |-.rc4. os projetos possuem uma árvore de arquivos fontes. segue a esquematização de um repositório: Repository |-. uma confusão danada.ear | |-. execução de algumas goals.jar | |-.nomedoejb-0.war |-.wars | `-. fazendo com que fique bastante complicado manter os scripts atualizados. iremos dar uma olhada em um outro conceito muito importante do Maven. existem muito mais coisas para aprendermos no decorrer desse tutorial. um projeto poderá produzir um único artefato. Mas no final. Abordamos alguns tópicos.1.ejbs | | `-. se você for considerar como os scripts do Ant são utilizados para criar múltiplos artefatos para um projeto -causando.) Projeto Agenda On-line .outrojarqualquer-1.servletapi `-.8-dev. como: configurações do POM. EARs.Dentro do diretório de um projeto.jar | `-. criação de um projeto simples. Porém. cada um deles poderá produzir um único artefato. É claro que ele te dará a flexibilidade para sobrescrever essa prática. No final. criação de WARs.0. iremos seguí-la no decorrer desse material. os dois tipos de artefatos mais comuns são JARs e distributions.nomedomoduloweb-1.ears | | `-. de onde todos os JARs de dependência.nomedemaisumjar-1. Atualmente. Porém.jars |-. JARs de dependência e por último.xml.0-dev.servletapi-2.2. Tipicamente. entre outros.servletapi-2. a idéia de dividir a aplicação é perdida e as classes são criadas em diferentes pacotes sem considerar o mecanismo de classloader.nomedojar-0. vários tipos de artefatos podem ser armazenados.0-dev.jars | `-.2-b1.jar | `-. entender como o Maven trabalha com projetos J2EE.

xml | | |.AgendaEjb ejb jar | |.Sub-projeto que irá produzir o agenda.maven.maven.Diretório contendo alguns arquivos de Utiliza o Maven Multiproject Plug-in Template de definitpo do Projeto Master Sub-projeto que irá produzir o agenda-web.maven.Definições do projeto AgendaEjb. Um arquivo EAR é composto de qualquer número dos seguintes componentes: . Estende as definições do Projeto Master .war Define as goals para o sub-projeto AgendaWeb Definições do projeto AgendaWeb.project. Estende as definições do Projeto Master .Sub-projeto que irá produzir o agenda-ejb.maven.xml | `. Não há nenhuma exigência do que deve ser minimamente incluso dentro de um arquivo EAR.project.xml | | |.Define as goals para o sub-projeto AgendaEjb . Estende as definições do Projeto Master .xml `.AgendaEAR | `.xml | `. Estende as definições do Projeto Master Listagem 13 .Relacionamento entre os projetos da Agenda On-line Agora.Define as goals para o sub-projeto AgendaServices . iremos utilizar o Maven em um projeto J2EE.Sub-projeto que irá produzir o agenda-online.jar.ear .AgendaServices services.project.project.xml | `.maven. um arquivo . Os componentes que podem ser empacotados dentro de um arquivo EAR não estão diretamente correlacionados com os componentes contidos nos containers.xml .Definições do projeto AgendaEAR.Definição das dependencias.conf configuração |.AgendaWeb | |.project.xml |.Define as goals para o sub-projeto AgendaEAR .jar |.xml | | `.xml |. O artefato J2EE mais comum gerado e publicado é o EAR.AgendaOnline |.

apresentamos o relacionamento entre os projetos. assim como sua hierarquia. item 1. E quando desviarmos dessa rota usual. Isso se deve ao fato de que o master project é um template para os sub-projetos estenderem.3 (Criando um projeto simples com o Maven Application Generator Plug-in) desse tutorial.jar | no seu CLASSPATH |.2. Você encontrará uma organização semelhante entre o conteúdo do EAR e o projeto J2EE com Maven.agenda-services-1.4.0-dev.jar .8. No item 2 desse tutorial. os scripts de build "out-of-the-box" do Maven.jar | ` META-INF .J2EE Application Master Project Na Agenda On-line iremos utilizar o template apresentado na Figura 1 .agenda-ejb-1.jar |.xml |.log4j-1. O Master Project é definido no nível mais alto dos projetos.xerces-1. apresentado na Listagem 13. É importante observar que as dependências não estão descritas nesse template. Um resumo do template do projeto master é apresentado abaixo (Listagem 15). Na maioria dos projetos J2EE não teremos um artefato de distribuição muito diferente do apresentado na Listagem 14. contendo somente os elementos essenciais. trabalharão para que tudo funcione.application.EJB e WAR possuem o agenda-services.ear |. agenda-online-1. Na Listagem 13 acima.jar |.4. você pode ver na íntegra todos os elementos do POM.0-dev. A Listagem 14 apresenta a estrutura do arquivo EAR gerado por esse projeto.0-dev.Organização de um projeto simples utilizando o Maven -.1.Figura 3 .

com.################################################################ --> <reports/> </project> Listagem 15 .neki.br</url> <logo>http://www.java</include> </includes> <excludes> <exclude>**/*Test*All.neki-technologies.local}/${pom.0-dev.com.Estrutura do EAR no projeto Agenda On-line .MF Listagem 14 .gif</logo> </organization> <inceptionYear>2003</inceptionYear> <package>br.cruz@neki-technologies.################################################################ --> <build> <nagEmailAddress>fabiano.################################################################ --> <!-Seção de Construção do Projeto --> <!-.################################################################ --> <!-Seção de Dependências do Projeto --> <!-.war ` META-INF ` MANIFEST.Template de definição do Master Project .################################################################ --> <!-Seção de Relatórios do Projeto --> <!-.(OPTIONAL) Resources packaged inside the JAR file.jar no | | `.neki-technologies.groupId}/${pom.java</exclude> </excludes> </unitTest> <resources/> <!-.artifactId}/ </distributionDirectory> <!-.################################################################ --> <organization> <name>Néki Technologies</name> <url>http://www. --> </build> <!-.com.*</package> <distributionDirectory> ${maven.0-dev</currentVersion> <name>Projeto Agenda Online</name> <!-.################################################################ --> <dependencies/> <!-.################################################################ --> <!-Seção de Gerenciamento do Projeto --> <!-.WAR manifest file possui o agendaseu CLASSPATH <?xml version="1.MF ejb.agenda-web-1.com.| ` MANIFEST.br</nagEmailAddress> <sourceDirectory>${basedir}/src</sourceDirectory> <unitTestSourceDirectory>${basedir}/test</unitTestSourceDirectory> <unitTest> <includes> <include>**/Test*.repo.0" encoding="ISO-8859-1"?> <project> <pomVersion>1</pomVersion> <groupId>agenda-online</groupId> <currentVersion>1.br/imagens/logo_neki.

Esse sub-projeto cria o arquivo agenda-services-1.jar . Entretanto. apresentado na Listagem 15. iremos analisar o project./project.com. Ele irá definir os elementos dependency. Aqui. Por ter estendido o pai.xml. Repare na tag extends a referência ao template do Master Project.xml.xml do projeto Agenda Services.service. eliminando a execução manual do Maven para todos os sub-projetos. existirá um maven.xml</extend> <id>agenda-services</id> <name>Agenda Services</name> <package>br. todas as propriedades serão herdadas. iremos adicionar uma funcionalidade básica. name e description definidos no pai. que ainda não existe no Maven WAR Plug-in.xml da aplicação Web da Agenda.neki. bastando executar maven jar:install na linha de comando. não há nenhuma . indicando suas dependências na API J2EE (que não foram definidas no pai) e irá sobrescrever o id. ficaria assim: <project default="main" xmlns:m="jelly:maven"> <goal name="main"> <attainGoal name="jar:install" /> </goal> </project> Listagem 17 . o maven. é hora do war.1</version> </dependency> </dependencies> </project> Listagem 16 . como veremos mais na frente. A aplicação Web depende das APIs J2EE providas pelo container em tempo de compilação. Primeiramente.0" encoding="ISO-8859-1"?> <project> <extend>${basedir}/.xml do sub-projeto Agenda Services Construindo o WAR (Web Module) Depois do ejb jar. <?xml version="1.0-dev.xml que irá nos auxiliar. assim como de execução.um sub-projeto no Maven. A atual definição do projeto possui muito mais dependências para serem baixadas. Então.3. ejb e camada web.maven. A parte importante é a seção de dependências. E por último. veremos como fica o arquivo maven.uma biblioteca de dependência utilizada por ambos. Entretanto. vamos dar uma examinada no maven.xml do projeto Agenda Services. A Listagem 18 apresenta o project.*</package> <description>Servicos referentes ao Projeto Agenda Online</description> <shortDescription>Agenda Services JAR</shortDescription> <dependencies> <dependency> <groupId>j2ee</groupId> <artifactId>j2ee</artifactId> <version>1. Portanto. Gastaremos um tempinho a mais nessa seção.Construindo o JAR de Serviço (Java Module) A Listagem 16 apresenta a definição do projeto de Serviço ..Definição do sub-projeto Agenda Services Agora. Tecnicamente falando. não precisaríamos fazer absolutamente nada para gerar o jar desse projeto. iremos mostrar as partes relevantes para ilustrar os conceitos.

jar será empacotado no WAR.1</version> <properties> <war. agenda-services-1.classpath>true</war. camada web e ejb. Você terá todas essas funcionalidades out of the box através do Maven WAR Plug-in.com. Sempre que o WAR Plug-in receber a instrução de empacotar os jars. <?xml version="1.dependencies}"> <j:if test="${dep.currentVersion}</version> <properties> <war. Entretanto. Coloque o código que segue abaixo. Dessa forma. No mais.getProperty('war. você não poderá utilizar bibliotecas de dependência.1. <j:forEach var="dep" items="${pom.web.classpath> </properties> </dependency> </dependencies> </project> Listagem 18 . Serão necessárias somente duas pequenas alterações. nessa goal. Setando a propriedade <war.0-dev. uma vez que o mesmo é uma biblioteca de dependência compartilhada por ambos.manifest. O WAR também depende do arquivo jar do Agenda Services.Definição do sub-projeto Agenda Web Entretanto. Sem essa característica. não queremos copiar o jar para o WEB-INF/lib.1. ele irá coloca-los dentro do diretório WEB-INF/lib do WAR.*</package> <description>Projeto Agenda Web</description> <shortDescription>Agenda web project</shortDescription> <dependencies> <dependency> <groupId>j2ee</groupId> <artifactId>j2ee</artifactId> <version>1./project.bundle>true</war.jar.maven/plugins/maven-war-plugin<version>-[SNAPSHOT].2b4</version> </dependency> <dependency> <groupId>struts</groupId> <artifactId>struts</artifactId> <version>1. teremos setada a propriedade war. Essas alterações devem ser feitas na goal de nome war.3.bundle>false</war. Então. Abra o plugin.necessidade de empacotar a API J2EE dentro do WAR. a aplicação web depende do JAR do Struts 1.neki.manifest. acrescentaremos esse característica no WAR Plug-in.bundle>.bundle> <war. o Maven WAR Plug-in não possui uma característica.bundle> </properties> </dependency> <dependency> <groupId>agenda</groupId> <artifactId>agenda-services</artifactId> <version>${pom.bundle como false para o arquivo agenda-services-1.jelly do WAR Plug-in em: C:/Documents And Settings/<login-id>/.jar.manifest.xml</extend> <id>agenda-web</id> <name>Aplicação Agenda Web </name> <package>br. uma vez que isso é responsabilidade do servlet container..0" encoding="ISO-8859-1"?> <project> <extend>${basedir}/. Ele não possui a capacidade de setar o manifest classpath.classpath')=='true'}"> . indicará que o struts1. Comparado à cópia manual dos jars para o diretório WEB-INF/lib.bundle>true</war.1</version> </dependency> <dependency> <id>xdoclet+web-module</id> <version>1. pelo Ant.0-dev.

quando for necessário.classpath} ${dep.war. repetidamente.xml do sub-projeto Agenda Web Construindo o EAR Até agora.war.classpath" value="${maven. no nosso caso.<j:set var="maven.dependencies) e irá checar se o war.classpath setada acima.war. O código de criação do manifest é apresentado abaixo.manifest. <ant:manifest> <ant:attribute name="Built-By" value="${user. você viu como criar cada artefato individual que irá para dentro do EAR. Você pode imaginar que o EAR deveria ser construído a partir da definição do projeto no topo da hierarquia.name}" /> </ant:section> </ant:manifest> Simples. logo o project.artifactId}" /> <ant:attribute name="Specification-Version" value="${pom.maven. tarefas dentro de preGoals e posGoals. o project.xml do diretório AgendaOnline poderia produzir um EAR. O manisfest file é criado pelo Ant Plug-in.organization. na raiz do diretório AgendaOnline. Entretanto. Caso sim.xml (identificada pelo pom. ao invés de ficar adicionando. Por que essa anomalia? Em primeiro lugar.name}" /> <ant:attribute name="Class-Path" value="${maven. O EAR é construído como um artefato de um sub-projeto chamado ear (veja Listagem 13).war.classpath}"/> <ant:section name="${pom. executando uma goal chamada manifest. então.construir o EAR propriamente dito. não é o caso.classpath está setado como true. Finalmente chegamos a última parte .package}"> <ant:attribute name="Specification-Title" value="${pom. .xml no nível do projeto AgendaOnline é um template para todos os outros sub-projetos estender. não é!? :) Espero que isso o estimule a criar seus próprios plug-ins.currentVersion}" /> <ant:attribute name="Specification-Vendor" value="${pom. Que irá utilizar a propriedade maven. É necessário inserir a linha em negrito para setar o atributo manifest classpath. Se o template tivesse sido definido em outro lugar. segue o maven.war. ele irá adicionar o nome do artefato na propriedade denominada maven. isso resultaria em uma dependência cíclica aquela situação do ovo e da galinha . Abaixo. A segunda alteração que precisa ser feita é quando o manifest file é escrito.classpath. provavelmente no nível mais alto.quando o template fosse estendido por outros sub-projetos. Se tivéssemos que especificar as dependências para construir o EAR.artifact}"/> </j:if> </j:forEach> Esse código irá iterar em cima de cada dependência descrita no project.xml: <project default="main" xmlns:m="jelly:maven"> <goal name="main"> <attainGoal name="war:install"/> </goal> </project> Listagem 19 . uma vez que o EAR é um único artefato para todo o projeto.

</description> 07 <dependencies> 08 <dependency> 09 <groupId>j2ee</groupId> 10 <artifactId>j2ee</artifactId> 11 <version>1. definidas por cada projeto no seu respectivo POM. Isso será setado no application.bundle>true</ear.appxml.bundle> 19 </properties> 20 </dependency> 21 <dependency> 22 <groupId>${pom.xml.COP).bundle>true</ear.3. O Reactor faz uso do pacote Werkz para determinar a ordem correta das dependências.ear.1</version> 12 </dependency> 13 <dependency> 14 <groupId>xerces</groupId> 15 <artifactId>xerces</artifactId> 16 <version>1. 01 <?xml version="1.ear.4.Type = war indicando que trata-se de um arquivo war. de projetos em unidades menores.0"?> 02 <project> 03 <extend>${basedir}/. Linha 36 .xml. Isso será setado no application.groupId}</groupId> 23 <artifactId>agenda-services</artifactId> 24 <version>${pom./project.currentVersion}</version> 25 <properties> 26 <ear.bundle> 27 </properties> 28 </dependency> 29 <dependency> 30 <groupId>${pom. mais coerentes e discretas. onde o sistema é .xml para o projeto Agenda EAR. O Reactor é ideal para a Programação Orientada a Componentes (Component Oriented Programming . o qual o ear depende. você poderá ver as bibliotecas mais relevantes (que precisam de alguma explicação).Definição do sub-projeto Agenda EAR • • Linha 33 . ou refatoramento.groupId}</groupId> 31 <artifactId>agenda-web</artifactId> 32 <version>${pom. Na lista.xml</extend> 04 <id>agenda-online</id> 05 <name>Agenda EAR</name> 06 <description>Projeto Agenda EAR.bundle> 36 <ear..porém o mesmo não seria utilizado como um template para o restante dos sub-projetos estenderem.context-root>AgendaWeb</ear.bundle>true</ear.currentVersion}</version> 33 <type>war</type> 34 <properties> 35 <ear.Coloca o context root para a aplicação web. A Listagem 20 apresenta o project.appxml. Essa ferramenta foi criada para encorajar a criação.context-root> 37 </properties> 38 </dependency> 39 </dependencies> 40 </project> Listagem 20 .4</version> 17 <properties> 18 <ear. Maven Multiproject Plug-in Através do Reactor podemos utilizar o Maven para controlar a construção de múltiplos projetos.

overviewPage.excludes maven.ignoreFailures maven.title maven. Propriedades do Multiproject Plug-in: Propriedade maven. relatórios de cobertura dos testes unitários.link maven.multiproject.includes maven. duplicidade de código.text maven.overviewPage. Usando arquivos XML como "porta de entrada" para as informações.multiproject.overviewPage.multiproject.type maven.Propriedade do Maven Multiproject Plug-in Descrição //TODO //TODO //TODO //TODO //TODO //TODO //TODO //TODO //TODO //TODO //TODO //TODO //TODO Opcional? //TODO //TODO //TODO //TODO //TODO //TODO //TODO //TODO //TODO //TODO //TODO //TODO //TODO MAVEN SITE Com o auxílio do Maven ficou simples gerar a documentação do projeto através de um site. dependências do projeto.overviewPage. O diretório xdocs é local onde são armazenados os arquivos para a construção dos HTML estáticos para o site do projeto. ou para a geração de qualquer outro artefato escolhido.multiproject. relatórios de métricas aplicadas nos códigos fonte.multiproject. ou gerar a documentação do projeto em outros formatos de arquivos (PDF).multiproject.navigation maven. Na documentação gerada podemos encontrar a lista de desenvolvedores.multiproject.overviewPage.multiproject.compreendido em várias pequenas entidades que necessitam ser agregadas para formar o todo para ser distribuído.text Tabela 02 . basta adicioná-lo ao diretório "xdocs" do projeto. Sendo assim. O Reactor pode executar uma lista arbitrária de goals para qualquer conjunto de projetos especificado.multiproject. relatório sobre análise da padronização dos códigos fonte. entre outras. o mesmo poderá ser utilizado para a geração do site. Para criar esse menu é simples. sendo transformados em arquivos HTML.multiproject.overviewPage.multiproject. Além disso.create maven. torna-se fácil mudar o look and feel completo do site.multiproject.aggregateDir maven. sendo facilmente mantida atualizada e consistente com as informações e propriedades do projeto. mailling list. JavaDocs.basedir maven. Esses arquivos são XML's que contém informações que desejam fazer parte da documentação do projeto. apesar do Reactor ter sido criado para o building.linkTitle maven. é criado um menu de navegação para orientar a equipe percorrer toda a documentação do projeto. Os arquivos XML contém algumas tag's próprias .multiproject. change logs.

xml. Para isso adicione collapse="true" na declaração do item. Para isso basta executar o comando: > maven site:deploy Assumindo que você tenha acesso ao Servidor Web. Goals: Goal xdoc xdoc:generatefrom-pom init-dvsl-tag Description A goal padrão. obtendo as descrições que existem nos vários arquivos XML que definem a estrutura do site. Para dar início a geração da documentação do projeto. mas podem conter também tag´s HTML (isso é essencial). que irá usar as configurações que estão definidas no descritor do projeto (project. basta executar o comando: > maven site:generate O resultado produzido por esse comando é a criação do diretório target/docs dentro do diretório base do seu projeto (no mesmo nível do diretório xdocs).apache.xml. o site gerado será publicado. Caso você tenha a responsabilidade de ser o mantenedor do site do projeto. Isso alterará o site do projeto de uma forma fácil e simples.para a geração da documentação através do Maven. que conterá a estrutura do menu para navegar pela documentação. Isso é uma tarefa simples para o Maven. mailing list.0" encoding="ISO-8859-1"?> <project name="Maven Xdoc Plugin"> <title>Maven Xdoc Plugin</title> <body> <menu> <links> <item name="Maven" href="http://maven. pode usar o Maven para publicar o site gerado diretamente no Servidor Web. Os itens podem ser expandidos ou não. para especificar as várias configurações como hostname do Servidor Web e diretório onde o site residirá. Gera um conjunto de relatórios a partir do arquivo project. Esta goal define a tag library DVSL para geração de documentação. Este diretório conterá todo o site do projeto com a documentação gerada. Esta goal simplesmente executa o xdoc:generate-from-pom e xdoc:transform. Para isso basta adicionar todos os itens e sub-itens que representem os arquivos HTML gerados a partir dos arquivos XML. pois são informações relevantes para o deployment.xml). Isso pode também ser facilmente automatizado. além das informações e propriedades do projeto e dos possíveis relatórios. reports e lista da equipe. project info. CONFIGURAÇÕES Uma das primeiras configurações é a criação de um simples navigation. Exemplo: <?xml version="1. A definição da é tag dvsl:dvsl. dependendo da sua navegação. Isto inclui dependência.org/"/> .

header.body.png"/> Podem ser adicionadas configurações para o Maven através do arquivo project.background maven.body.table.background Opcional? Descrição Sim Sim Sim Especifica a cor de background color usada para o body de cada pagina. Especifica a cor de background usada nas linhas pares da tabela. O valor default é #ddd (gray).ui. Especifica a cor de background usada nos headers de primeiro nível das seções.background maven.table.html" collapse="true"/> </item> </menu> </body> </project> Para adicionar uma imagem a um item de navegação basta adicionar a opção img: <item name="The Site" href="http://www.header.ui.odd.ui.ui.thesite.table.foreground maven.ui.banner.</links> <item name="Alpha" href="/alpha/index.background Sim maven. Especifica a cor usada para o borda superior do banner.row.odd.html"/> <item name="Alpha Two" href="/alpha/two/index.thesite. O valor default é #369 (azul). Especifica a cor de foreground usada nas linhas de header das tabelas. Especifica a cor de foreground usada nas linhas pares da tabela.background maven.net/thesite.ui. O valor default é #fff (branco). Especifica a cor de foreground usada para o body de cada página.table.row. O valor default é #fff (branco).row.table. O valor default é #fff (branco). O valor default é #036 (dark blue).top Sim Sim Sim Sim Sim Sim Sim Sim Sim . Especifica a cor de foreground usada no banner.banner. O valor default é #ddd (gray). Especifica a cor de foreground usada nos headers de primeiro nível das seções. O valor default é #036 (dark blue).ui.foreground maven. O valor default é #fff (branco).ui. O valor default é #888 (gray).html"/> </item> <item name="Beta" href="/beta/index. O valor default é #000 (preto).ui. maven.border. O valor default é #000 (preto). Especifica a cor de foreground usada nas linhas ímpares da tabela. Especifica a cor de background usada nos headers de segundo nível das seções.home}: Propriedade maven.row.foreground Sim maven. O valor default é #bbb (gray).section.ui.background maven.background maven.banner.ui.section. Especifica a cor de background usada no banner. Especifica a cor de foreground usada nos headers de segundo nível das seções.ui. O valor default é #fff (branco).foreground maven.foreground Sim maven.foreground maven.net/" img="http://www.ui.even.foreground maven.even.html" collapse="true"/> <item name="Beta Two" href="/beta/two/index.ui.properties que se encontra em ${project.html" collapse="true"> <item name="Beta One" href="/beta/one/index. Especifica a cor de background usada nas linhas ímpares da tabela.html"> <item name="Alpha One" href="/alpha/one/index.ui. Especifica a cor de background usada nas linhas de header das tabelas.table.subsection. O valor default é #000 (preto).subsection.

background Sim Sim Sim Sim maven.docs. O valor default é #fff (branco).href.active Sim Sim Propriedades de organização de diretórios Propriedade maven.background maven.navcol. Esses arquivos depois são transformados para HTML. Especifica a cor usada para background na barra horizontal de navegação lacalizada imediatamente abaixo do banner (esse elemento não aparecerá caso a página não tenha links especificados).docs.source.top Sim maven. Especifica a cor usada na borda inferior da coluna de navegação. Especifica a cor usada na borda superior da coluna de navegação.ui.border. Especifica a cor usada para todos os links quando estes estão ativos.ui. Especifica a cor usada para todos os links.ui. O valor default é #aaa (gray). Especifica a cor usada na borda inferior da seção horizontal de navegação.ui.breadcrumbs. O valor default é #888 (gray). Especifica a cor usada para foreground dos source regions. Especifica a cor usada na borda superior dos source regions.bottom Sim maven. Especifica a cor usada para foreground na barra horizontal de navegação localizada imediatamente abaixo do banner (esse elemento não aparecerá caso a página não tenha links especificados).navcol. O valor default é #f30 (vermelho). O valor default é #888 (gray).src maven. Especifica a cor usada no background dos source regions. O valor default é #ddd (gray).build.ui.border.ui.border.breadcrumbs.border. .breadcrumbs. O valor default é #fff (branco). O valor default é #fff (branco).foreground Sim maven.top maven.bottom maven. O valor default é ${basedir}/xdocs.ui.ui.ui.source. Especifica a cor usado para background na coluna de navegação que fica no lado esquerdo da página. Especifica a cor usada na borda inferior dos source regions.href.source. O valor default é #000 (black).ui.navcol. Especifica a cor usada para foreground na coluna de navegação que fica no lado esquerdo da página. Especifica a cor usada na borda superior da seção horizontal de navegação.ui. O valor default é ${maven. O valor default é #003 (preto).dir}/generated-xdocs.ui.source.border.bottom maven.gen.breadcrumbs.foreground maven. O valor default é #aaa (gray).docs Opcional? Descrição Sim Sim Sim Especifica a localização dos arquivos gerados a partir do xdocs.link maven.dest maven.background Sim Sim Sim Sim Sim Sim Sim Sim Especifica a cor usada para o borda inferior do banner.navcol.foreground Sim maven. O valor default é ${maven. O valor default é #036 (dark blue).banner. O valor default é #aaa (gray).border.left maven. O valor default é #888 (gray).right maven.dir}/docs.border. O valor default é #eee (gray). O valor default é #888 (gray).ui. Especifica a cor usada na borda do lado direito dos source regions.source. O valor default é azul.source.right maven.navcol.link.top maven.ui.bottom maven. Especifica a localização da documentação "xdocs" do projeto. Especifica a cor usada na borda do lado direito da coluna de navegação.ui.build.border.border. Especifica a localização onde os arquivos xdocs do Maven são armazenados. maven.maven. Especifica a cor usada na borda do lado esquerdo dos source regions.ui.border.ui. O valor default é #000 (preto).ui.

O padrão é "http://maven.date": • • • • • left righ navigation-top navigation-bottom bottom Se "maven.date.xdoc. O Padrão é "Powered by Maven". O diretório test-reports/ contém os relatórios target/classes target/test-classes target/iutest-classes target/generated-docs target/test-reports Contém os resultados .xdoc. O diretório target/generated-docs contém todas os xdocs gerados pelo Maven.xdoc.xdoc.jsl Sim Sim Sim Organização das documentações geradas: Diretório target/ Conteúdo Contem classes compiladas e JARs.date" esta vazio.xdoc.poweredby. Contém os xdocs gerados pelo Maven Comentários O conteúdo do diretório target deve ser muito utilizado no projeto. Para detalhes sobre formatação veja SimpleDateFormat na documentação do JDK. Este diretório é usado para empacotar o JAR final para o projeto.: "14 August 2002").poweredby.date Sim Sim Separador entre links. Configura o título do link para a logo de powered. O padrão é | Permite o usuário mostrar a data de geração do site. O diretório target/classes contém todas as classes compiladas.locale" tem como default o "en" (ex.image Sim Sim maven. O diretório target/test-classes contém todas as classes dos testes unitários compiladas.date.crumb.org/" O JSL stylesheet usado para converter xdocs para HTML.title maven.date. então o mesmo stylesheet usado para transformar o resto do site pode ser usado para gerar o conteúdo.xdoc. Padrão é "en".xdoc.locale maven. Contém as classes de teste unitários compilados. O valor default é a logo de Stéphane Mor. Contém as classes compiladas para os testes unitários de integração. Para sobrescrever especifique-o como um arquivo: URL. Configura o link para a logo de powered. Configura o nome da imagem usada (veja images/logos). Contem classes compiladas e JARs.poweredby.xdoc. maven.xdoc. O "maven. O padrão é "dd MMMM yyyy" (ex. nenhuma data é mostrada no site.: english).apache.xdoc.url maven.Outras Propriedades maven.xdoc.separator maven. maven. Configura o locale usado para data. Essa data pode ficar em 5 lugares diferentes com o "maven. O diretório target/iutest-classes contém todas as classes dos testes unitários de integração compilados. Este diretório contem os JAR's gerados. Este diretório é usado quando executados os testes unitários. Este diretório é usado durante a execução dos testes unitários de integração.format Sim Configura o formato da data que será mostrada. O conteúdo para este diretorio é transformado e armazenado no diretório docs. Todo o conteúdo gerado pelo Maven é primeiro convertido para o formato xdoc.

. O log de alterações registradas no CVS. O Maven gera automaticamente um relatório com várias métricas de analise sobre os códigos fontes. então o Maven do projeto. crossreferenced sources e vários relatórios gerados. Relatório de métricas. O Maven gera automaticamente um log a partir dos arquivos alterados nos últimos 30 dias que estão em seu SCM por desenvolvedor. Estes relatórios facilitam a visão completa do projeto.individuais dos testes unitários. target/docs/junit-report. JavaDocs. O Maven gera automaticamente um log a partir dos arquivos alterados nos últimos 30 dias que estão em seu SCM. target/docs/mail-lists. A lista das dependências. API da documentação. target/docs Arquivos de documentação para o site a ser publicado.html Relatório dos testes unitários. Relatório das atividades dos desenvolvedores. target/docs/team-list. O Maven gera automaticamente o log de alterações a partir do log de mensagens do CVS. individuais dos testes unitários em ambos os formatos XML e texto.html sobre a documentação no diretório xdocs.html target/docs/changelog.html target/docs/dependencies. Colocando a documentação da API no diretório docs/apidocs faz com que seja fácil referenciar outras documentações que estejam no diretório docs e vice-versa. mostrando aos desenvolvedores como usar o software apropriadamente de uma forma fácil.html target/docs/jdependreport. target/docs/apidocs target/docs/xref target/docs/xref-test Referência de testes para o código fonte.html target/docs/developer-activityreport. O Maven automaticamente gera a lista de dependências do projeto baseada nas informações providas pelo descritor do projeto. A lista da equipe do projeto.html target/docs/file-activityreport. Referência para o código fonte. O Maven gera automaticamente as referências para os códigos fontes que permite uma navegação fácil através da estrutura de fontes. Este log é atualmente limitado para os últimos 30 dias. target/docs/index.html Relatório das alterações por arquivos. Este diretório inclui os arquivos HTML. Os JavaDocs do projeto são gerados automaticamente usando o utilitário JavaDoc. Colocando esses referências no diretório docs/xref/ é fácil referenciar a documentação da API e vice-versa.html A página inicial para Se o projeto não contém uma página index. Geralmente toda a documentação é armazenada no diretório xdocs e então transformada para o seu respectivo diretório. Os relatórios existentes nesse diretório é usado quando o Maven cria o relatório final sobre os testes unitários. O diretório docs contém somente as documentações geradas com a intenção de ser publicadas no site do projeto.html Documentação sobre o Mailing list. O Maven gera automaticamente a lista dos membros da equipe baseada nas informações providas pelo descritor do projeto. O Maven gera automaticamente as referências para os códigos fontes dos teste. automaticamente cria uma página simples baseada nas informações descritas nos elementos do descritor do projeto. O Maven gera automaticamente a lista de mailing lists baseada nas informações providas pelo descritor do projeto. O Maven gera automaticamente relatórios com resultados dos testes unitários.

No project. Isto é feito facilmente com a inclusão da tag reports no descritor do projeto.xml: <reports> <report>maven-changes-plugin</report> <report>maven-faq-plugin</report> <report>maven-multiproject-plugin</report> </reports> O adicionamento de um plugin chamado xyz para geração de um determinado relatório deve ser feito utilizando o seguinte valor na tag "report": maven-xyz-plugin. tanto para as equipes técnica. você pode incluir ou excluir determinados tipos de relatórios que são gerados com a utilização de plugins do Maven. <postGoal name="xdoc:register-reports"> <attainGoal name="maven-changelog-plugin:deregister"/> <attainGoal name="maven-meu-plugin:register"/> </postGoal> . ou retirar algum. vários relatórios podem ser gerados automaticamente. de qualidade ou gerencial.target/docs/checkstylereport. O conjunto padrão de relatórios é definido no plugin xdoc o qual tem como valor padrão os seguintes plugins: • • • • • • • • • • • • • maven-changelog-plugin maven-changes-plugin maven-checkstyle-plugin maven-developer-activity-plugin maven-file-activity-plugin maven-javadoc-plugin maven-jdepend-plugin maven-junit-report-plugin maven-jxr-plugin maven-license-plugin maven-linkcheck-plugin maven-pmd-plugin maven-tasklist-plugin Caso seja desejado usar o conjunto padrão de relatórios. Esses relatórios são gerados através do comando maven site. Mas o uso dessa tag não é obrigatório. RELATÓRIOS Através da utilização do Maven. todos esses são adicionados no menu de navegação na ordem em que são adicionados. onde a supressão de seu uso faz com que um conjunto de relatórios padrão seja gerado. a melhor forma de fazer isso é usar postGoal para xdoc:register-reports.html Relatório do Checkstyle. mas adicionar algum em especial. provendo conjunto de informações relevantes sobre o projeto. Com essa tag. O Maven gera automaticamente um relatório com os resultados do Checkstyle. Com este relatório poderá ser analisado se as convenções adotadas para o projeto estão sendo seguidas.

tags around it.AT. Um "xdoc" é um arquivo XML composto por pequenos e simples conjuntos de tags.xdoc. Stevens</author> <author email="mrsmith.</p> <source> Anything within this tag is rendered as a "box" with blue lines and &lt. Os arquivos que não são XML e/ou sub-diretórios são copiados sem modificação.com">Mr.0"?> <document> <properties> <author email="nospam.foo. java"/> <body> <section name="Section 1"> <p>This is section 1.</p> <table> <tr> <td>This is a table</td> </tr> </table> <ul> <li>This is an unordered list. Todos os arquivos XML existentes no diretório são convertidos utilizando JSL. O Maven utiliza esse formato por completo.</li> </ol> </section> <section name="Section 3"> <p>This is section 3.</p> <ol> <li>This is an ordered list.includeProjectDocumentation com o valor de "no".AT.pre&gt./pre&gt. com isso é permitido a inclusão de outros tipos de documentos (inclusão de imagens).</li> </ul> </section> <section name="Section 2"> <p>This is section 2. Smith</author> <title></title> </properties> <meta name="keyword" content="jakarta. os quais então são transformados em HTML através desse plugin.A documentação dos sites que agregam um conjunto de subprojetos e que devem conter a inclusão completa da documentação do projeto como seções na barra de navegação de seus sites. Isso é feito com o uso de Jelly/JSL que transformam arquivos XML em HTML. onde os relatórios gerados são primeiramente gerados como um "xdoc". Os arquivos XML devem ser compostos de sintaxe XML/XHTML que sejam passíveis de "parser" padrão para XML (Xerces).DOT. Exemplo: <?xml version="1.&lt. Os arquivos HTML gerados automaticamente herdam o look-and-feel padrão do Maven. </source> . //TODO: rever! MAVEN XDOC PLUGIN O plugin XDoc é o principal mecanismo utilizado para produzir a documentação do projeto gerado pelo Maven. Por padrão o Maven icluirá a documentação do projeto na seção da barra de navegação com a qual incluirá informações sobre o projeto tão quanto links para os numerosos relatórios gerados pelo próprio Maven. Isto pode ser feito com a configuração da propriedade maven.com">Jon S. tão quanto qualquer informações fornecida pela equipe no "xdocs".DOT.foo.

a . Tags <source> são especiais..docs. Exemplo: <footer> <A href="http://sourceforge.</p> </subsection> </section> </body> </document> Explicando algumas coisas: • • • • • É possível ter uma ou mais tags <author> É possível ter uma ou mais tags <section> Dentro da tag <section> é possível ter uma ou mais tags <p>.xml e deve ser colocada dentro do elemento body. Por padrão este plugin copiará todos os arquivos localizados no diretório maven. Se estiver utilizando outras marcações XML/XHTML dentro das tags source. Tag <meta> são colocadas como tags dentro da <document> e vão direto para o arquivo html. </menu> Adicionando mais usabilidade aos xdocs. Você pode utilizar a tag footer para incluir texto ou imagens abaixo do menu de navegação e acima do aviso de copyright.docs. Esta tag tem somente uso no arquivo navigation. arquivos HTML. EXEMPLOS DE REPORTS Changes: Com esse relatório você pode navegar por todo o site do projeto e ter um resumo de todas as alterações que ocorrem. Isto permite você facilmente adicionar e modificar os styles providos pelo Maven.src.php?group_id=72748" border="0" alt="sf logo"/> </A> </footer> Se o elemento search é encontrado dentro do body do arquivo navigation. Exemplo: <source><![CDATA[conteúdo foo]]></source> No exemplo do arquivo xml. Com isso as alterações que ocorrem diariamente.css abaixo de maven. ele será copiado para a árvore de documentos e importado para dentro de cada página (via @import). uma opção de pesquisa é gerada no menu de navegação.xml. <project name="foo"> <body> <menu name="bar"> <search/> </body> </project> . PDF's etc. Caso seja criado um style/project. estamos utilizando a tag <pre> e podemos ver que esta não precisa estar em uma CDATA. podem ser incluídos outros tipos de arquivos como imagens. existem somente dentro das tags <section> e <subsection>..net/sflogo.<subsection name="Subsection of Section 3"> <p>This is the subsection 3. então é necessário utilizar CDATA.net/projects/ctecl"> <IMG src="http://sourceforge. a qual usará o google.src para a geração final do site. Qualquer tipo de texto deve estar entre tags <p> e pode conter outras marcações XHTML.

com">Vincent Massol</author> </properties> <body> <release version="1. O formato para esse arquivo é o seguinte: <?xml version="1.com"> Added Form-based authentication support (Submitted by Jason Robertson).. </action> <action dev="vmassol" type="add"> Added a <link href="howto_build. é necessário criar o arquivo changes.html">tutorial</link> that explains how to build Cactus from the sources.5" date="in CVS"> <action dev="vmassol" type="add" due-to="Jason Robertson" due-to-email="Jason..Robertson@acs-inc.xml no diretório xdocs. remove update ou fix.] </release> </body> </document> O atributo "type" pode ser add.0"?> <document> <properties> <title>Changes</title> <author email="vmassol@octo.cada dois dias ou semanalmente (a partir de suas configurações) podem ser acompanhadas e ver o que esta acontecendo de novo. </action> [. Para adicionar esse relatório: • maven-changes-plugin Exemplo: . Para habilitar esse relatório.

Developer Activity: Identifica cada desenvolvedor e seu commits e arquivos alterados. Para adicionar esse relatório: • maven-file-activity-plugin Exemplo: Task List: Identifica a classe. Para adicionar esse relatório: • maven-tasklist-plugin Exemplo: . Para adicionar esse relatório: • maven-developer-activity-plugin Exemplo: File Activity: Identifica o nome do arquivo e a quantidade de vezes que ele foi alterado. a quantidade de "TODO's" e os métodos com "TODO".

MÉTRICAS Durante o desenvolvimento de um produto de software. São definidas as medidas explícitas (obtidas diretamente). através do acompanhamento quantitativo de diversos aspectos como produtividade. Sem uma política bem definida para definição desse subconjunto de métricas. Um defeito pode ser definido como qualquer problema ou imperfeição encontrado em um produto ou artefato de software. devido à quantidade e à complexidade dos fatores envolvidos no desenvolvimento de um software de grande porte. a partir das quais se pode construir medidas derivadas. Uma vez modelado o processo de desenvolvimento e alguns conceitos utilizados na medição. entre outros. acurácia de estimativas. a probabilidade de se escolher arbitrariamente as métricas mais adequadas é muito remota. São . No contexto de uma organização produtora de software. é possível definir as medidas a serem coletadas. procedimentos de medição e análise de dados quantitativos permitem que se obtenha informações objetivas quanto à qualidade do produto em construção e possibilitam um controle preciso da evolução do projeto. de forma a viabilizar as atividades de coleta e análise. o uso de medições permite que se tenha um melhor conhecimento da eficácia do processo de desenvolvimento. evolução da qualidade de produtos desenvolvidos. cuja correção implique na alteração de pelo menos um artefato produzido. Um exemplo de medida explícita é o registro de defeitos. há tantos aspectos a serem medidos que torna-se necessário selecionar apenas um subconjunto restrito. Em primeiro lugar.

Um módulo de análise. Este trabalho prevê. devem ser registrados todos os defeitos encontrados. Para adicionar esse plugin: • maven-jdepend-plugin Exemplo: . Simplesmente por usar modelagem OO pode ser insuficiente para obter robustez. a coleta e análise manual dos dados tornam-se inviáveis. como pattern de interdependência entre design de sub-sistemas. principalmente no contexto dos grandes projetos de software.clarkware. A existência de ferramentas automatizadas que dêem suporte a essas atividades torna-se. isolar elementos reusáveis de elementos não reusáveis e blocos de propagação de mudança em manutenção. Segue abaixo uma visão geral do uso dessa métrica: O objetivo dessa análise é verificar o design se esta flexível. que engloba funcionalidades que oferecem suporte à realização das medições. Algumas formas de dependência são desejadas. A solução será composta de dois módulos principais: • • Um módulo de coleta. com o objetivo de oferecer apoio ao trabalho de análise do resultado das medições.http://www. manutenibilidade e reusabilidade. essencial. quanto pelo custo envolvido. enquanto outras não. Durante o ciclo de vida do projeto. que contempla recursos para a visualização gráfica dos indicadores quantitativos e métodos estatísticos para o processamento das métricas. tanto pelo risco de erros decorrentes de falhas humanas.html Analisa classes Java e gera métricas sobre a qualidade do "Design" para cada package Java. sendo tratadas à parte.considerados defeitos apenas os problemas decorrentes de erros cometidos por membros da equipe de desenvolvimento. JDepend permite a equipe de Qualidade automaticamente mensurar a qualidade do "Design" em termos de suas extensibilidades. Alterações de requisitos solicitadas pelo cliente ou usuário não são consideradas defeitos. o uso de uma solução que ofereça apoio informatizado à gestão das métricas escolhidas.com/software/JDepend. portanto. armazenando os resultados obtidos em relatórios que se encontram no site do projeto. Plugin's Jdepend . interdependente e fácil de manutenção. Existem outros atributos que são requeridos. Objetivos Procedimentos de coleta e análise de métricas envolvem geralmente uma grande quantidade de informação. além da definição da política de medição. Nesses casos. reusabilidade e manutenibilidade para controle efetivo das dependências dos packages Java.

Imports duplicados. Parâmetros que não são usados. Métodos privados que não estejam sendo utilizados. Blocos de IF's sem preenchimento.http://pmd. tais como: • • • • • • • Variáveis locais que não declaradas. O conjunto de "Rules" pode ser estendido. Para isso basta criar uma nova rule/verificador utilizando uma expressão em XPath. Blocos catch que estejam vazios. Classes que poderiam ser Singletons.sourceforge. Alguns exemplos de "Rules" analisadas pelo PMD: • • • • • • • • EmptyCatchBlock EmptyIfStmt EmptyWhileStmt EmptyTryBlock UseSingletonRule JUnitAssertionsShouldIncludeMessageRule JUnitSpelling ExcessiveImportsRule CPD: . Essa ferramenta utiliza a abordagem de "Rules". são configuradas as principais/qualquer "best pratices" que deverá ser seguida pela equipe de desenvolvimento.net É uma ferramenta que analisa os arquivos "java" e procura por problemas de relativa importância. ou seja.PMD . através da criação de novos verificadores.

net/clover Essa ferramenta abrange todos os teste unitários. descobrindo possíveis bugs existentes. Dessa forma. executando uma interação com as classes de testes do JUnit. Análogo ao Simbian (ver abaixo). De posse dos relatórios os testes podem ser analisados e sofrer refactoring para que possam cobrir por completo os testes especificados. analisando a cobertura dos testes para as classes relacionadas.Desenvolvido como um plugin ao PMD. Após a cobertura dos testes é gerado um relatório com a analise focada em cada classe dos packages existentes. tem como objetivo analisar códigos Java e identificar as classes que contém duplicidade em código.thecortex. O uso desse dessa ferramenta no ciclo de integração continua mantém a equipe de qualidade com informações atualizadas sobre o quão estão os testes da equipe de desenvolvimento cobrindo as classes desenvolvidas. a qualidade de cada e se esta apto a atender a necessidade a serem analisadas. Para adicionar esse plugin: • maven-pmd-plugin Exemplo: Clover . tendo como um dos seus principais problemas identificados no seu uso o não apontamento onde ocorreu a duplicidade de códigos entre classes. possibilita a equipe de qualidade analisar os testes que estão sendo desenvolvidos. mas não tão efetivo em sua analise. .http://www.

html Um analisador de código Java com o intuito de localizar duplicidade em código. Ações do tipo "copiar e colar" que são freqüentes entre desenvolvedores e um atraente modo de propagação de erros que dificilmente são identificados pelos testes unitários.au/products/simian/index.Para adicionar esse plugin: • maven-clover-plugin Exemplo: Simian . apontando as classes que contém código repetido. Para adicionar esse plugin: • maven-simian-plugin Exemplo: . Auxilia na atividade de "refactoring" como um guia.com.http://www. O Simbian identifica essas duplicações que em sua grande maioria apontam erros em design e acoplamentos não desejados na modelagem.redhillconsulting.

Alguns exemplos de verificações executadas pelo CheckStyle: • • • • • • • • • • • • • Comentários Javadoc Convenção de nomes Headers Imports Size Violations Whitespace Modifiers Blocks Problemas de codificação Class Design Código duplicado Checagem de métricas Checagem personalizada Para adicionar esse plugin: • maven-checkstyle-plugin .sourceforge. suportando todas as padronizações de código e podendo seguir as convenções da SUN Microsystems.CheckStyle . O processo de checagem do código fonte passa a ser executado de forma automatizada.http://checkstyle. Configuração simples e flexível. tornando-se ideal para projetos que pretendem manter a padronização de código. garantindo qualidade e legibilidade de códigos Java.net Uma ferramenta desenvolvida para auxiliar desenvolvedores a escreverem código Java que estejam de acordo com uma padrão estabelecido pela equipe de Qualidade.

o Maven foi criado para facilitar a vida dos desenvolvedores provendo uma estrutura bem definida para o projeto. Podemos dizer que o Maven alivia muitas tarefas que consideramos árduas e que teriam que ser "feitas na mão". Dessa forma. o layout do projeto. informados no que está acontecendo no projeto. . No outro lado temos as IDEs Java. um arquivo XML que descreve. com a sua própria maneira de representar as configurações necessárias a construção do projeto. dentre outras coisas. o Maven utiliza-se do conceito do POM (Project Object Model). temos uma discrepância que torna difícil a manutenção do projeto e o sincronismo entre essas partes. Para alcançar esse o objetivo.Exemplo: TESTES EXECUTANDO TESTES UNITÁRIOS //TODO MAVENIDE Como vimos. através de um processo bem definido que deve ser seguido e uma gama de documentação consistente que mantém de desenvolvedores a clientes.

org.jar.grabber_0.1. Instalação Uma vez baixado.xml ou . que irá verificar o timestamp do project.classpath do projeto.config_0. como: edição do POM. Existindo um número significativo de coisas que podem ser feitas. você deve fazer o unzip em um diretório temporário e copiar para um diretório apropriado dentro do Eclipse. Isso irá prevenir problemas de sobrescrita de arquivos de configuração.1. Maven Home e Maven repository são informações requeridas para executarmos com sucesso o MavenIDE. o arquivo mevenide. um plug-in é normalmente instalado no Eclipse fazendo um unzipping dos arquivos baixados e copiando o conteúdo dos mesmos para o diretório plug-ins e features do Eclipse. deverá ser unzipado diretamente no sub-diretório features do Eclipse. Ele será utilizado na como esqueleto na criação de novos POMs. Se você quiser.core_0.feature_0.Mavenide procura integrar o Maven nas IDEs padrão de mercado.jar. o arquivo org. Se o Eclipse estiver sendo executado.ui_0. Em Window > Preferences > Maven. também poderá checar a opção 'Check timestamp before syncronizing'. Por ultimo.jar. Por segurança.1. Java Home. . gerenciar as propriedades de tempo de execução do Maven etc.0.mevenide. executar o Maven de dentro da IDE. Um template para o POM também poderá ser especificado.update_0. org.jar.1.mevenide. Nesse caso.mevenide. org.mevenide.mevenide.jar. Configurações Antes de utilizarmos o MavenIDE. necessitam ser unzipado diretamente no sub-diretório plugins do Eclipse. você precisará parar e restartar para que os plug-ins sejam reconhecidos.1. através da página de preferências do Maven. enquanto que os arquivos: org. sincronização entre a IDE e POM. você poderá especificar uma goal default a ser executada para todos os projetos.jar deve ser unzipado dentro do diretório 'raiz' do Eclipse (ele automaticamente cairá no diretório de plug-ins e features). prover wizards para a "mavenização" de projetos.1.1. Faremos isso.1.1.1. Por último. deveremos configurá-lo adequadamente.

Figura 01 .'.Maven Preferences Para executar scripts a partir do Eclipse...xml) e no 'MavenIDE Menu'. Como segue abaixo: . basta clicar com o botão direito do mouse no POM (Project Object Model .project. utilizando o MavenIDE. clique na opção 'Run Maven.

.Figura 02 . A tabela é utilizada para passarmos propriedades do sistema para o Maven. não estão acessíveis).. A caixa de texto na parte inferior do wizard poderá ser editada e nela iremos colocar as goals que serão executadas. um wizard irá aparecer para que você coloque as informações relevantes no contexto da IDE (isso significa que.. -h. entre outras. opções como -b.' do Maven menu. As propriedades de sistema poderão ser especificadas utilizando o botão 'Add'. -p.MavenIDE Menu Quando você seleciona a opção 'Run Maven.

classpath. . quando estivermos sincronizando o POM. onde o usuário irá especificar qual artefato será colocado dentro do POM. E a outra. Esse comando irá executar a goal default especificada na página de preferências.Atalho para execução do Maven Podemos visualizar o output da operação na própria console de debug do Eclipse. POM Synchronization Mavenide POM Synchronization é basicamente uma única página.Figura 03 . em Run > External Tools > Run As > Maven Project. precisaremos prover algumas informações adicionais. Figura 04 . permite que o usuário especifique toda o status das dependências existentes no POM Source Directory Synchronization Uma vez que o POM contém muito mais informações que o Eclipse . dada a inexistência de uma console para o Mavenide (versão atual). composta de dois elementos: • • Uma aba.Wizard de execução do Maven Você também poderá utilizar o atalho do Eclipse.

Para toda Eclipse SourceFolder. artifactId e version de uma determinada dependência. mas o mesmo será assinalado com nonResolvedGroupId e uma key será adicionada ao project. Note também que se a biblioteca nao estiver instalada no repositório local. O usuário deverá declarar se existe ou não herança.properties fazendo uso da facilidade do Maven jar overriding.Página do wizard Maven Source Directory Mapping Dependency Synchronization Mavenide prove um mecanismo automático de resolução das dependências. Se não existir herança. seu groupId não será resolvido. então a checkbox (terceira coluna) ficará desabilitada. Ele pode falhar. Figura 03 . . o tipo do Maven Source Directory tem que ser especificado através da página do wizard Maven Source Directory Mapping. podendo determinar de maneira precisa o groupId. então o usuário poderá auxiliá-lo utilizando a página do wizard Dependency Mapping.

.Página do wizard Dependency Mapping Mavenide prove o suporte a dependências de propriedades através da caixa de diálogo Dependency Properties que poderá ser acessada pressionando o botão "Properties".Figura 04 .

dê a sua opinião a respeito do conteúdo apresentado. Correções. sugestões ou qualquer outra informação relevante é de suma importância para nós e será muito bem vinda.Feedback Por favor. Contato: owner@hotwork.net .dev.java.

Sign up to vote on this title
UsefulNot useful