Você está na página 1de 49

Maven User Guide

http://hotwork.sourceforge.net/hotwork/manual/maven/maven-user-guide.html 1. INTRODUO 1. INSTALAO E CONFIGURAO 2. EXEMPLO DE UTILIZAO 1. Criando um projeto simples com o Maven Application Generator Plug-in 2. Conceitos Bsicos 3. Comandos Bsicos 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 ATRAVS DO MAVEN.XML 4. MAVEN SETUP 1. PLUG-IN PROPERTIES 2. BEHAVIORAL PROPERTIES 3. UTILIZANDO PROXIES 4. UTILIZANDO MLTIPLOS REPOSITRIOS REMOTOS 5. REMOTE REPOSITORY LAYOUT 6. PROJETOS J2EE COM MAVEN - EXEMPLO 1. PROJETO AGENDA ON-LINE 2. MASTER PROJECT 3. CONSTRUINDO O JAR DE SERVIO (JAVA MODULE) 4. CONSTRUINDO O WAR (WEB MODULE) 5. CONSTRUINDO O EAR 6. MAVEN MULTIPROJECT PLUG-IN 7. MAVEN SITE 1. CONFIGURAES 2. RELATRIOS 3. MAVEN XDOC PLUGIN 4. EXEMPLOS DE REPORTS 5. MTRICAS 8. TESTES 1. EXECUTANDO TESTES UNITRIOS 9. MAVENIDE 1. INSTALAO 2. CONFIGURAES 3. POM SYNCHRONIZATION 4. SOURCE DIRECTORY SYNCHRONIZATION 5. DEPENDENCY SYNCHRONIZATION

Sobre esse Tutorial


Nki Technologies. Agradecimentos ao Nki Team!

Introduo
"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 padro para a construo de aplicaes Java. Originalmente parte do cdigo 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 devero ser realizadas para o projeto, como por exemplo, compilao, empacotamento (jar, war e ear), deployment, javadocs, integrao com frameworks de teste, controladores de verso, entre outros. Porm, apesar de incontestvel sua utilizao, o ANT deixa a desejar quando se trata de gerenciamento do projeto como um todo. Examinando um script de build, fica impossvel sabermos quais so as dependncias do projeto, seus responsveis, verso, entre outras metainformaes do projeto. Maven vai alm! Baseando-se no conceito de um Project Object Model (POM), todos os artefatos produzidos pelo Maven so resultantes de um modelo bem definido para o seu projeto. Em poucas linhas de descrio do projeto, pode-se facilmente realizar algumas tarefas padro - compilao, empacotamento (jar, war, ear), deployment, entre outras sem que seja necessria a criao e/ou customizao de scripts de build. Essa facilidade faz com que essa ferramenta seja cada vez mais incorporada no s aos projetos da Jakarta, mas tambm aos projetos corporativos. Bastante flexvel, o ANT permite executar uma infinidade de tarefas para o projeto, porm pagasse um preo razoavelmente alto no desenvolvimento de uma quantidade significativa de linhas de cdigo para a criao de scripts. J com o Maven, despendesse um esforo na descrio do projeto, no entanto com a utilizao de plug-ins, todo o "trabalho sujo" que deveria ser programado atravs de scripts, no ser mais necessrio. A restrio imposta pelo Maven para que voc no precise programar scripts complexos, a de gerar um artefato por projeto (entende-se projeto aquela pasta que contm o project.xml). Ento, no 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 peas e coloc-las dentro de um EAR. Claro que todo esse trabalho facilitado, atravs de plug-ins e herana. Quem j trabalhou em projetos corporativos utilizando o ANT, sabe o quo complexo se torna gerir todos os scripts criados, alm claro, da quantidade de scripts que realizam tarefas similares ou muitas vezes idnticas, construdos quase sempre atravs do famoso "Crtl+C, Crtl+V". O fato que precisamos executar atividades que so de uma certa forma padro, ou seja, precisamos compilar e empacotar classes, compartilhar bibliotecas, recursos, remover diretrios, arquivos, entre outros. O problema comea a ficar mais srio quando se perde o controle sobre quais so as dependncias internas e externas - verses dos frameworks externos e mdulos internos utilizados no projeto -, quando no existe nenhum procedimento de medio e anlise de dados quantitativos para se obter informaes objetivas quanto qualidade

do produto em construo, possibilitando um controle preciso da evoluo do projeto e principalmente quando o desenvolver balbucia aquela celebre frase: "mas isso funcionava na minha mquina!".

Instalao e Configurao
Atualmente o Maven distribudo em vrios formatos: um arquivo de instalao 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. Faa o download do arquivo maven-1.0-rc1.zip (veja links); 2. Crie a varivel de ambiente MAVEN_HOME apontando para o diretrio 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 varivel 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 instalao foi um sucesso.
__ __ | \/ |__ Jakarta _ ___ | |\/| / _ \ V / -_) ' \ ~ intelligent projects ~ |_| |_\__,_|\_/\___|_||_| v. 1.0-rc1-SNAPSHOT

Exemplo de utilizao Criando um projeto simples com o Maven Application Generator Plug-in
Uma boa forma de automatizar o processo de criao de um novo projeto utilizando o Maven atravs 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 diretrio aonde o projeto de exemplo possa ser criado e digite: maven -Dmaven.genapp.template.package=br.com.neki genapp. ENTER para as demais opes. 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 <diretrio do projeto>\src\java\com\neki [copy] Copying 3 files to <diretrio do projeto>\src\test\com\neki

[copy] Copying 1 file to <diretrio do projeto> [copy] Copying 2 files to <diretrio do projeto> BUILD SUCCESSFUL Total time: 5 seconds
Listagem 1 - Output de criao do projeto utilizando o Maven Application Generator Plugin

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

Figura 1 - Organizao de um projeto simples utilizando o Maven

Conceitos Bsicos
Antes de executar os comandos bsicos, sero apresentados alguns conceitos importantes utilizados pelo Maven. O principal deles o projeto. No "mundo Maven" significa dizer: qualquer diretrio que contenha um project.xml um projeto e se esse, por sua vez, contiver sub-diretrios que possuam seu project.xml, eles tambm sero considerados projetos. O repositrio remoto, que dentre outras coisas, elimina completamente a necessidade de armazenamento de arquivos jars no CVS, um outro conceito importante. Atravs da anlise das dependncias descritas para o projeto, o Maven ir se encarregar de efetuar automaticamente o download dos artefatos de um ou mais repositrios remotos. Quando trazidos, eles sero armazenados no repositrio local, criado em um diretrio chamado ".maven/repository", que quando no especificada sua localizao, ficar no ${user.home}. Em uma mquina Windows isso seria o equivalente a C:\Documents And Settings\${nome_do_usurio}. Abaixo segue a esquematizao do processo:

Figura 2 - Esquematizao do processo de build do Maven

importante salientar que na seqncia sero apresentados em detalhes os elementos descritos acima, formas de configurar a localizao dos repositrios e como descrever as dependncias do projeto.

Comandos Bsicos
Para executar alguns comandos bsicos em cima do projeto criado, v at o prompt de comando na raiz do projeto exemplo. Abaixo, segue um quadro explicativo com alguns comandos simples que podero ser executados:
Comando maven java:compile maven jar:jar Descrio Compila o cdigo fonte do projeto. O diretrio dos arquivos fontes definido atravs da target build do project.xml. Cria um arquivo jar para o projeto no diretrio de build do Maven, no formato ${project.id}-${project.currentVersion}.jar, onde o id e a currentVersion so definidos no project.xml Gera um site com a documentao do projeto: jdepend, javadoc, checkstyle, junitreport, tasklist, xdoc, changelog entre outros. Por default, o site do projeto ser criado no diretrio: ${diretrio do projeto}/target/docs. Remove os diretrios criados pelo Maven no processo de build. //TODO

maven site:generate maven clean maven -g

Tabela 1 - Comandos bsicos do Maven

Nota Importante: Antes de voc brigar comigo, bom avisar que na primeira vez que formos executar o Maven, ele ir baixar da net (repositrio remoto) uma srie de jars e plugins necessrios a sua execuo. Portanto, no fique irritado com isso, pois s na primeira vez. Tome um pouquinho de caf, vai dar uma voltinha e em seguida continue a sua leitura. Abaixo segue um exemplo de execuo do comando maven jar:jar:
__ __

| \/ |__ Jakarta _ ___ | |\/| / _ \ V / -_) ' \ ~ intelligent projects ~ |_| |_\__,_|\_/\___|_||_| v. 1.0-rc1-SNAPSHOT Attempting to download maven-SNAPSHOT.jar. Overriding previous definition of reference to clover.classpath java:prepare-filesystem:java:compile: [echo] Compiling to <diretrio do projeto>/target/classes java:jar-resources: Copying 1 file to <diretrio do projeto>\target\classes test:prepare-filesystem: [mkdir] Created dir: <diretrio do projeto>\target\test-classes [mkdir] Created dir: <diretrio do projeto>\target\test-reports test:test-resources: test:compile: [javac] Compiling 3 source files to <diretrio do projeto>\target\test-classes test:test: [junit] dir attribute ignored if running in the same VM [junit] Running com.neki.AppTest [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.05 sec jar:jar: [jar] Building jar: <diretrio do projeto>\target\app-1.0.jar BUILD SUCCESSFUL Total time: 18 seconds
Listagem 2 - Output de execuo da goal jar do Maven JAR Plugin

PROJECT OBJECT MODEL (POM)


Materializado pelo arquivo project.xml, pode-se entender por POM (Project Object Model), o local onde sero definidas todas as informaes acerca do projeto. Suas dependncias, relatrios que devero ser gerados, informaes gerenciais e localizao dos arquivos fontes do projeto, so alguns dados que estaro contidos nesse arquivo. Uma diviso bastante interessante e didtica pode ser feita quando se trata de explicar o POM. Podemos dividi-lo em quatro grandes sees: gerenciamento, dependncias, construo e relatrios do projeto. Utilizaremos como exemplo o project.xml do projeto gerado pelo Maven Application Generator Plug-in, apresentado acima. Os itens que aparecem em negrito so obrigatrios.
01 <?xml version="1.0" encoding="ISO-8859-1"?> 02 <project> 03 04 <pomVersion>3</pomVersion> 05 <id>app</id> 06 <currentVersion>1.0</currentVersion> 07 <name>Example Application</name> 08 09 <!-- A Seo de Gerenciamento do Projeto entrar aqui --> 10 11 <!-- A Seo de Dependncias do Projeto entrar aqui -->

12 13 <!-- A Seo de Construo do Projeto entrar aqui --> 14 15 <!-- A Seo de Relatrios do Projeto entrar aqui --> 16 17 </project>
Listagem 3 - Exemplo de um Project Object Model (POM)

A linha 04, apesar de no ser diretamente utilizada, descreve a verso do POM e obrigatria. As linhas 05 e 06 definiro o nome do artefato que ser armazenado no repositrio local no momento da instalao do projeto ("${pomId}${pomCurrentVersion}.jar"), no caso acima: app-1.0.jar. A linha 07 representa o nome dado ao projeto. Na Seo de Gerenciamento do Projeto, que ser apresentada em detalhes abaixo, podero estar descritas algumas informaes importantes, tais como: detalhes da organizao detentora do produto, data da criao, descrio, pacote, logotipo, lista de discusso, equipe, entre outras informaes que tambm iro fazer parte do web site do projeto criado pelo Maven. Ainda nesse tutorial, ser apresentada uma maneira da organizao ter um projeto-base que servir como um template para que algumas informaes no precisem ser reescritas a cada mdulo, ou seja, uma forma de herdar o POM. O nico elemento obrigatrio o nome da organizao, como segue abaixo:
01 <organization> 02 <name>Apache Software Foundation</name> 03 <url>http://www.apache.org/</url> 04 <logo>http://maven.apache.org/images/jakarta-logo-blue.gif</logo> 05 </organization> 06 07 <inceptionYear>2002</inceptionYear> 08 <package>com.neki</package> 09 <logo>http://maven.apache.org/images/maven.jpg</logo> 10 <description>...</description> 11 <shortDescription>...</shortDescription> 12 <url>http://maven.apache.org/reference/plugins/examples/</url> 13 <issueTrackingUrl> 14 http://nagoya.apache.org/scarab/servlet/scarab/ 15 </issueTrackingUrl> 16 <siteAddress>jakarta.apache.org</siteAddress> 17 <siteDirectory> 18 /www/maven.apache.org/reference/plugins/examples/ 19 </siteDirectory> 20 <distributionDirectory> 21 /www/maven.apache.org/builds/ 22 </distributionDirectory> 23 24 <repository> 25 <connection> 26scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:maven/src/plugins27build/examples 28 </connection> 29 <url> 30 http://cvs.apache.org/viewcvs/maven/src/plugins- build/examples/ 31 </url> 32 </repository> 33 34 <mailingLists> 35 <mailingList> 36 <name>Maven User List</name> 37 <subscribe>users-subscribe@maven.apache.org</subscribe> 38 <unsubscribe>users-unsubscribe@maven.apache.org</unsubscribe> 39 </mailingList>

40 41 42 43 44 45 46 47 48 49 50

... ... </mailingLists> <developers> <developer> <name>Fabiano Cruz</name> <id>fabianocruz</id> <email>fabiano.cruz@neki-technologies.com.br</email> </developer> <developers/>

Listagem 4 - Seo de Gerenciamento do Projeto no POM

Linhas 01 a 05 - informaes da organizao; Linha 07 - data de criao do projeto; Linha 08 - pacote principal do projeto; Linha 09 - logotipo do projeto; Linha 10 - uma descrio um pouco mais detalhada a respeito do projeto; Linha 11 - uma descrio sucinta do projeto; Linha 12 - web site do projeto; Linhas 13 a 15 - localizao da ferramenta de controle das atividades do projeto - requisitos, alteraes, pendncias, bugs etc; Linha 16 - site onde o projeto est hospedado; Linhas 17 a 19 - diretrio de publicao do site do projeto; Linhas 20 a 22 - diretrio de distribuio do artefato gerado pelo projeto; Linhas 24 a 32 - informaes a respeito do controle de verso; Linhas 34 a 42 - lista de discusso utilizada para debates a respeito do projeto; Linhas 44 a 50 - informaes a respeito da equipe envolvida com o projeto.

A Seo de Construo do Projeto geralmente definida no projeto-base e nela sero colocadas as informaes relevantes compilao e execuo dos testes para o projeto. Nenhum item dessa seo obrigatrio, porm, a no definio far com que o Maven ignore a existncia de cdigo fonte e testes no projeto. Uma vez definidas as informaes dessa seo, o Maven ir compilar os arquivos Java e quando terminado, ir rodar os testes automaticamente.
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.apache.org </nagEmailAddress> <sourceDirectory>src/java</sourceDirectory> <unitTestSourceDirectory>src/test</unitTestSourceDirectory> <unitTest> <includes> <include>**/*Test.java</include> </includes> <excludes> <exclude>**/NaughtyTest.java</exclude> </excludes> </unitTest> <resources> <resource> <directory>src/conf</directory> <includes> <include>*.properties</include> </includes> </resource> </resources> </build>

Listagem 5 - Seo de Construo do Projeto no POM

Linhas 02 a 04 - Endereo de e-mail para o envio de notificaes a respeito do status da construo da aplicao; Linha 05 - Diretrio contendo os arquivos fontes do projeto. Os arquivos fontes podero ser arquivos Java, JSP etc; Linha 06 - Diretrio contendo os testes unitrios do projeto; Linhas 09 a 11 - Nome padro para os arquivos que devero ser includos na execuo dos testes, quando no trmino da compilao do projeto; Linhas 12 a 14 - Arquivos que devero ser excludos dos testes Linhas 18 a 24 - Arquivos que devero ser adicionados ao artefato criado - jar e war.

As Sees de Dependncias e Relatrios no so criadas pelo plug-in (Maven Application Generator Plug-in), portanto, os exemplos apresentados abaixo no esto no project.xml do projeto exemplo. Pode-se dizer que a Seo de Dependncias do Projeto umas das mais importantes dentro do POM, pois nela estaro descritas todas as dependncias necessrias compilao e execuo do projeto. Uma vez descritas as dependncias, o Maven ir procura-las no repositrio local e quando no encontradas, elas sero automaticamente baixadas.
01 <dependencies> 02 <dependency> 03 <groupId>log4j</groupId> 04 <artifactId>log4j</artifactId> 05 <version>1.2.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 - Seo de Dependncias do Projeto no POM

Linha 03 - Diretrio onde est o artefato (jar) descrito na seqncia; Linhas 04, 05 e 06 - Juntas iro descrever o nome, a verso e o tipo de artefato requerido. No nosso caso, o arquivo: log4j-1.2.8.jar. Quando no especificada a tag type, ser utilizado por default o arquivo do tipo jar, porm os tipos ejb, plugin, war, ear e tld tambm so suportados. Linha 11 - Quando na tag version colocada a palavra SNAPSHOT, significa que o Maven sempre ir buscar a ltima verso daquele artefato. Deve-se ter cuidado quando se estiver trabalhando off-line, pois voc poder estar com uma verso desatualizada no seu repositrio local.

Na Seo de Relatrios do Projeto estaro descritos os diferentes tipos de relatrios a serem gerados assim que o processo de build terminado. Esses relatrios estaro concentrados no site do projeto criado pelo Maven. Eles so uma ferramenta de apoio bastante eficiente na implantao de um processo de qualidade na organizao, dada a riqueza das informaes geradas. No se preocupe com os detalhes dessa seo. Mais na frente sero 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>

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 - Seo de Relatrios do Projeto no POM

Processamento do POM
Processado como um script Jelly, o j familiar POM poder dentre outras coisas, ser estendido e/ou conter trechos programados. Na verdade, na grande maioria das vezes, no precisaremos nos preocupar como funcionam scripts em Jelly, porm teremos o poder de trabalhar com estruturas condicionais, de repetio, sobrescrever propriedades etc. Abaixo, segue um exemplo:
<?xml version="1.0" encoding="ISO-8859-1"?> <project> <pomVersion>3</pomVersion> <id>maven</id> <name>Maven</name> <currentVersion>1.0-b5-dev</currentVersion> <organization> <name>Apache Software Foundation</name> <url>http://jakarta.apache.org/</url> <logo>/images/jakarta-logo-blue.gif</logo> </organization> <inceptionYear>2001</inceptionYear> <package>org.apache.${pom.artifactId}</package> <logo>/images/${pom.artifactId}.jpg</logo> <description> Maven is a project that was created in ${pom.inceptionYear}. </description> <shortDescription> ${pom.name} is a Java Project Management Tool </shortDescription> </project>
Listagem 8 - Exemplo de utilizao de scripts em Jelly

As partes em negrito sero substitudas pelos valores descritos no POM.

Herdando um POM
Abaixo, segue um exemplo de herana:
<?xml version="1.0" encoding="ISO-8859-1"?> <project> <extend>project.xml</extend> <id>super-extendo</id> <name>Super Extendo</name> <build> <unitTest> <includes> <include>**/*Test*.java</include> </includes> <excludes>

<exclude>**/TestAll.java</exclude> <exclude>**/*Abstract*.java</exclude> </excludes> </unitTest> </build> </project>


Listagem 9 - Exemplo de herana de um POM

PLUG-INS
Essa a essncia do Maven! So eles, os PLUG-INS, os grandes responsveis pelo sucesso dessa ferramenta. Dedicados a trabalhos especficos - compilao, execuo de testes, criao de jar etc -, os PLUG-INS so extremamente poderosos e simples de serem desenvolvidos, quando necessrio.

maven.xml
Esse um arquivo 'especial' lido pelo Maven durante o processamento. Aqui, voc poder sobrescrever goals e/ou criar um procedimento especial para o seu projeto copiar coisas, invocar outras goals, criar uma goal, entre outros. Maven utiliza scripts escritos em uma linguagem denominada: Jelly ( http://jakarta.apache.org/commons/sandbox/jelly/), portanto, qualquer tag Jelly, vlida, poder ser colocada dentro de um arquivo maven.xml.

Exemplo
Nota: Abaixo, apresentaremos um exemplo ilustrativo, pois o Maven no define a goal 'compile' como default. 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 <!-- Any ant task, or jelly tags can go here thanks to jeez --> 08 <j:set var="goals" value="compile,test" /> 09 <mkdir dir="${maven.build.dir}" /> 10 <u:tokenize var="goals" delim=",">${goals}</u:tokenize> 11 <j:forEach items="${goals}" var="goal" indexVar="goalNumber"> 12 Now attaining goal number ${goalNumber}, which is ${goal} 13 <attainGoal name="${goal}" /> 14 </j:forEach> 15 </goal> 16 </project>
Listagem 10 - Exemplo de um arquivo maven.xml

Linha 01 - elemento principal de todos os arquivos maven.xml; Linha 02 - o atributo default (default="nightly-build") definir a goal que ser executada quando nenhum parmetro for passado pelo maven, ou seja, simplesmente executando maven na linha de comando;

Linha 03 - seguindo, temos as declaraes de alguns XML namespaces, por exemplo: xmlns:j="jelly:core", que diz ao Jelly que todos os elementos XML prefixados com j: so parte de uma tag library predefinida, registrada com o identificador core dentro do Jelly; Linha 04 - xmlns:u="jelly:util", que diz ao Jelly que todos os elementos XML prefixados com u: so parte de uma tag library predefinida, registrada com o identificador util dentro do Jelly; Nota: 1. Qualquer tag library Jelly que voc queira utilizar dentro do maven.xml dever estar declarada no elemento project e ter um namespace definido. 2. O Maven j mantm pr-registrado a tag library jeez com um prefixo vazio. Essa tag agrupa as tag libraries Ant e werkz dentro de um namespace. Isso permite, que o Maven utilize qualquer tag Ant ou werkz sem precisar definir um namespace, fazendo com que o processo de migrao de qualquer fragmento de script Ant, seja bastante simples.

Linha 06 - Similar as targets do Ant, as goals do Maven iro agrupar uma srie de atividades a serem executadas. Dentro delas, poderemos colocar qualquer tag Ant. Para executar uma goal definida no maven.xml, basta passar o nome da goal parmetro para o Maven na linha de comando. Por exemplo, para executar a goal 'nightly-build', definida no nosso exemplo, basta digitar: > maven nightly-build Nota: 1. Os plug-ins escritos para o Maven, sempre colocam como prefixo da goal o seu prprio nome, sendo fcil identific-lo. Por exemplo: jar:jar, a goal jar definida pelo plug-in para criar um arquivo jar para o seu projeto

Linha 08 - Dentro de cada goal, poderemos ter qualquer tag Jelly ou Ant, como apresentado em Nota acima. No nosso exemplo: <j:set var="goals" value="compile,test"/> , utilizando o namespace j:, definido elemento project, invocaremos a funo set da tag library core do Jelly. Essa funo ir setar a varivel, cujo nome est definido no atributo var, com o valor colocado no atributo value. Linha 09 - <mkdir dir="${maven.build.dir}"/>, ir executar task mkdir do Ant, criando o diretrio especificado pela varivel ${maven.build.dir}. Linha 10 - <u:tokenize var="goals" delim=",">${goals}</u:tokenize>, utilizando o namespace u:, definido no elemento project, invocaremos a funo tokenize da tag library util do Jelly. Atributos: 1. O Atributo var ser setado com o valor na nova lista; 2. O atributo delim o delimitador utilizado para separar os itens da string; 3. No corpo da tag tokenize, encontramos a varivel goals, setada algumas linhas acima, que contm compile e test separados por vrgula. Linha 11 a 14 - Aqui temos a funo forEach: <j:forEach items="${goals}" var="goal" indexVar="goalNumber">, que ir facilitar a vida quando o assunto estrutura de repetio. Atributos: 1. O atributo items uma expresso que ir conter a coleo a ser iterada; 2. O atributo var especificar o nome da varivel que receber cada item da coleo durante o processamento 3. O atributo indexVar conter o nome da varivel que ir receber o contador com o nmero de elementos a serem processados (zero-based).

Dentro da funo, temos o output de um texto que ir informar o nome da goal e o nmero a ser processado e invocar a goal, utilizando a tag werkz: attainGoal.

Customizando o Maven atravs do maven.xml


At agora, vimos como compilar classes Java utilizando o Maven e tambm criar arquivos jars. Vimos tambm, que atravs do arquivo maven.xml, residente na mesma pasta do arquivo project.xml, podemos customizar as aes do Maven. Veremos agora, como definir, alm de goals, pre e post goals.
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.result.dir}"/> 13 <echo>Creating directories</echo> 14 </postGoal> 15 16 </project>
Listagem 11 - Exemplo de um arquivo maven.xml, com pre e pos goals

Acima, colocamos um exemplo de maven.xml. Repare a goal default do projeto, aqui definida como: foobar-dist. A goal foobar-dist simplesmente um wrapper para uma outra goal denominada war:install. A goal "install" do Maven WAR Plug-in, cria um war e publica-o dentro do repositrio. A instruo "attainGoal" ir executar a goal descrita no atributo name. O elemento preGoal instrui o Maven a executar as tarefas definidas dentro dele, antes de executar a goal especificada no nome do atributo. Isso pode gerar alguma confuso s vezes. Note que a preGoal (java:compile) diferente da goal default (foobar-dist). A goal default para esse projeto, instala o arquivo war. Entretanto, o WAR Plug-in precisa compilar arquivos Java antes de criar o arquivo WAR. A preGoal especificada est muito mais ligada a goal java:compile, do que a goal foobar-dist. Nesse caso, a preGoal ir executar um Maven Xdoclet Plug-in. Um postGoal pode ser especificado para qualquer goal implcita que seja parte da goal default ou a prpria. No exemplo, a postGoal especificada para a goal war:war, que executada antes da goal war:install. A postGoal especifica que um dado diretrio deve ser criado depois de construdo o WAR.

MAVEN SETUP
Os arquivos de propriedade utilizados pelo Maven so processados segundo a seguinte ordem:
${project.home}/project.properties ${project.home}/build.properties ${user.home}/build.properties

Onde a ltima definio vence. Portanto, o Maven utiliza essa seqncia de arquivos de propriedades para sobrescrever qualquer propriedade definida anteriormente, pela nova propriedade, segundo essa ordem. Nessa seqncia, o arquivo: ${user.home}/build.properties, tem a palavra final na lista de arquivos de propriedades processados. No mais, as propriedades de sistema sero processadas aps a seqncia de arquivos, apresentados acima. Portanto, as propriedades especificadas via CLI (commandline), utilizando a conveno: -Dproperty=value, iro sobrescrever qualquer propriedade definida anteriormente.

Plug-in Properties
Os Plug-ins so carregados depois de processada a seqncia de propriedades definidas acima, porm, o PluginManager foi programado para no sobrescrever os valores que tiverem sido previamente setados. Isso funciona de forma oposta ao processamento normal das propriedades do Maven, uma vez que os Plug-ins s podero ser carregados depois que o kernel do Maven for inicializado. Seria algo do tipo:
As propriedades default do Plug-in so processadas ${project.home}/project.properties so processadas ${project.home}/build.properties so processadas ${user.home}/build.properties so processadas

Ento, uma vez que os Plug-ins so processados tardiamente no ciclo de inicializao, voc poder sobrescrever qualquer propriedade default definida pelo plug-in. Por exemplo, o plug-in CheckStyle define a propriedade default, que segue abaixo:
maven.checkstyle.format = sun

Aqui, o plug-in CheckStyle, recebe a instruo de utilizar a conveno de cdigo definida pela SUN, como formato default. Mas, voc poder sobrescrever esse valor em qualquer um dos arquivos de propriedades, descritos acima. Portanto, se voc colocar o trecho, que segue abaixo, no arquivo: ${project.home}/project.properties, o plug-in CheckStyle passar a utilizar a conveno de cdigo definida pelo Turbine.
maven.checkstyle.format = turbine

Behavioral Properties
Abaixo, a tabela apresenta a lista de propriedades que altera a forma com que o Maven trabalha:
Propriedade maven.build.dest maven.build.dir Descrio Diretrio para aonde as classes geradas ir. Diretrio para aonde os outputs gerados, por exemplo: arquivos .class, documentao relatrios de testes unitrios etc, ir. CUIDADO: Alterar o valor default da Valor Default ${maven.build.dir}/classes ${basedir}/target/

propriedade maven.build.dir, no seu ${user.home}/build.properties, pode permitir algum controle sobre a estrutura de diretrio do projeto. Porm, essa prtica interferir com o bootstrap do Maven a partir do cdigo fonte, uma vez que ele espera que o jar criado para o projeto esteja em: ${basedir}/target/. maven.build.src maven.conf.dir maven.docs.dest Diretrio para aonde arquivos fontes gerados ir. O diretrio que armazena os arquivos de configurao. O diretrio de output dos htmls gerados dos relatrios. ${maven.build.dir}/src ${basedir}/conf ${maven.build.dir}/docs false

maven.docs.omitXmlDeclaration Se a documentao gerada deve conter uma declarao xml, por exemplo: <?xml version="1.0"?> maven.docs.outputencoding maven.docs.src maven.gen.docs O character enconding da documentao gerada. O diretrio que contm a documentao fornecida pelo usurio. O diretrio aonde os xdocs, que precisam ser transformados em html, so colocados. O diretrio na mquina local utilizado pelo Maven para escrever detalhes especficos do usurio, como por exemplo: informaes expandidas de plug-ins e cache. Se voc est conectado a internet ou no. Onde o Maven pode encontrar os plug-ins. Onde o Maven ir expandir os plugins a serem instalados para o processamento. Esse o host que o Maven ir utilizar para fazer o deploy da distribuio, durante um dist:deploy. Esse o diretrio que o Maven ir copiar a distribuio, durante um dist:deploy. O repositrio na mquina local, que o Maven ir utilizar para armazenar os artefatos baixados (jars etc). O repositrio que o Maven ir utilizar para baixar os artefatos (jars etc), que no forem encontrados na mquina local. Se o repositrio remoto deve ou no ser utilizado. O executvel utilizado para cpias seguras.

ISO-8859-1 ${basedir}/xdocs ${maven.build.dir}/generatedxdocs ${user.home}/.maven

maven.home.local

maven.mode.online maven.plugin.dir maven.plugin.unpacked.dir

true ${maven.home}/plugins ${maven.home.local}/plugins

maven.repo.central

login.ibiblio.org

maven.repo.central.directory

/public/html/maven

maven.repo.local

${maven.home.local}/repository

maven.repo.remote

http://www.ibiblio.org/maven

maven.repo.remote.enabled maven.scp.executable

true scp

maven.src.dir maven.ssh.executable

O diretrio base para o arquivos fontes. O executvel utilizado para executar comandos remotamente.

${basedir}/src scp

Tabela 2 - Propriedade do Maven

Utilizando Proxies
Se voc estiver atrs de um proxy, o Maven ir obedecer as seguintes propriedades:
Propriedade maven.proxy.host maven.proxy.port maven.proxy.username maven.proxy.password Descrio O endereo IP do seu proxy. O nmero da porta do seu proxy. Nome do usurio, caso o seu proxy requeira autenticao. Senha, caso o seu proxy requeira autenticao.

Tabela 3 - Propriedade do Maven utilizando Proxies

Se voc precisa utilizar um proxy, o lugar mais apropriado para setar os valores dessas propriedades ser no seu arquivo: ${user.home}/build.properties. Abaixo, segue um exemplo:
## ---------------------------------------------------------## ${user.home}/build.properties ## ---------------------------------------------------------maven.proxy.host = meu.servidorproxy.com.br maven.proxy.port = 8080 maven.proxy.username = nomedousuario maven.proxy.password = senha

Utilizando Mltiplos Repositrios Remotos


Voc poder especificar o uso de mltiplos repositrios remotos em qualquer um dos arquivos de propriedades processados pelo Maven, simplesmente, fazendo algo como o que segue abaixo:
maven.repo.remote = http://www.ibiblio.org/maven/,http://www.meusite.com.br/maven/

REMOTE REPOSITORY LAYOUT


O objetivo dessa seo apresentar o layout do repositrio remoto do Maven. Atualmente, o repositrio principal est hospedado no Ibiblio (http://www.ibiblio.org/maven/), mas voc poder utilizar os seus repositrios remotos, desde que estejam de acordo com a estrutura apresentada nesse documento. Todo projeto tem o seu prprio diretrio no repositrio, onde os artefatos para o projeto podero ser armazenados. Cada projeto tem um id nico e um diretrio onde o mesmo, ir armazenar seus artefatos nomeados aps o id do projeto.

Dentro do diretrio de um projeto, vrios tipos de artefatos podem ser armazenados. Atualmente, os dois tipos de artefatos mais comuns so JARs e distributions. Abaixo, segue a esquematizao de um repositrio:
Repository |-- seuprojeto | |-- ears | | `-- nomedoear-0.9-beta.ear | |-- ejbs | | `-- nomedoejb-0.8-dev.jar | |-- jars | | |-- nomedojar-0.2-b1.jar | | |-- nomedooutrojar-1.2.jar | | |-- nomedemaisumjar-1.0-dev.jar | | `-- outrojarqualquer-1.0-dev.jar | `-- wars | `-- nomedomoduloweb-1.1.war |-- ojb | `-- jars | `-- ojb-1.0.rc4.jar | `-- servletapi `-- jars |-- servletapi-2.2.jar `-- servletapi-2.3.jar
Listagem 12 - Layout do Repositrio Remoto

PROJETOS J2EE COM MAVEN EXEMPLO


Nas sees acima, pudemos analisar o funcionamento bsico do Maven. Abordamos alguns tpicos, como: configuraes do POM, criao de um projeto simples, execuo de algumas goals, plug-ins, maven.xml, entre outros. Porm, existem muito mais coisas para aprendermos no decorrer desse tutorial. Iremos agora, entender como o Maven trabalha com projetos J2EE, criao de WARs, EJB-JARs, JARs de dependncia e por ltimo, EARs. Porm, antes de qualquer coisa, iremos dar uma olhada em um outro conceito muito importante do Maven. No Maven, um projeto poder produzir um nico artefato. O projeto mais externo poder ter mltiplos sub-projetos e esses por sua vez, tambm podero conter outros sub-projetos. Mas no final, cada um deles poder produzir um nico artefato. Isso faz bastante sentido, se voc for considerar como os scripts do Ant so utilizados para criar mltiplos artefatos para um projeto -causando, quase sempre, uma confuso danada. Tipicamente, os projetos possuem uma rvore de arquivos fontes, monoltica, de onde todos os JARs de dependncia, WARs e EARs so criados utilizando diferentes scripts de build. No final, a idia de dividir a aplicao perdida e as classes so criadas em diferentes pacotes sem considerar o mecanismo de classloader, fazendo com que fique bastante complicado manter os scripts atualizados. O Maven desencoraja essa prtica. claro que ele te dar a flexibilidade para sobrescrever essa prtica. Mas como somos bastante obedientes e gostamos muito do Maven, iremos segu-la no decorrer desse material. ;)

Projeto Agenda On-line

AgendaOnline |- conf configurao |- maven.xml |- project.xml |- AgendaWeb | |- maven.xml | `- project.xml | | |- AgendaEAR | `- maven.xml | `- project.xml | | |- AgendaEjb ejb jar | |- maven.xml | `- project.xml | | `- AgendaServices services.jar |- maven.xml `- project.xml

- Diretrio contendo alguns arquivos de Utiliza o Maven Multiproject Plug-in Template de definitpo do Projeto Master Sub-projeto que ir produzir o agenda-web.war Define as goals para o sub-projeto AgendaWeb Definies do projeto AgendaWeb. Estende as definies do Projeto Master

- Sub-projeto que ir produzir o agenda-online.ear - Define as goals para o sub-projeto AgendaEAR - Definies do projeto AgendaEAR. Estende as definies do Projeto Master - Sub-projeto que ir produzir o agenda-ejb.jar, um arquivo - Define as goals para o sub-projeto AgendaEjb - Definies do projeto AgendaEjb. Estende as definies do Projeto Master - Sub-projeto que ir produzir o agenda- Define as goals para o sub-projeto AgendaServices - Definio das dependencias. Estende as definies do Projeto Master

Listagem 13 - Relacionamento entre os projetos da Agenda On-line

Agora, iremos utilizar o Maven em um projeto J2EE. O artefato J2EE mais comum gerado e publicado o EAR. Os componentes que podem ser empacotados dentro de um arquivo EAR no esto diretamente correlacionados com os componentes contidos nos containers. No h nenhuma exigncia do que deve ser minimamente incluso dentro de um arquivo EAR. Um arquivo EAR composto de qualquer nmero dos seguintes componentes:

Figura 3 - J2EE Application

Master Project
Na Agenda On-line iremos utilizar o template apresentado na Figura 1 - Organizao de um projeto simples utilizando o Maven -, item 1.1.3 (Criando um projeto simples com o Maven Application Generator Plug-in) desse tutorial. Na Listagem 13 acima, apresentamos o relacionamento entre os projetos, assim como sua hierarquia. O Master Project definido no nvel mais alto dos projetos. Um resumo do template do projeto master apresentado abaixo (Listagem 15), contendo somente os elementos essenciais. No item 2 desse tutorial, voc pode ver na ntegra todos os elementos do POM. importante observar que as dependncias no esto descritas nesse template. Isso se deve ao fato de que o master project um template para os sub-projetos estenderem. A Listagem 14 apresenta a estrutura do arquivo EAR gerado por esse projeto. Voc encontrar uma organizao semelhante entre o contedo do EAR e o projeto J2EE com Maven, apresentado na Listagem 13. Na maioria dos projetos J2EE no teremos um artefato de distribuio muito diferente do apresentado na Listagem 14. E quando desviarmos dessa rota usual, os scripts de build "out-of-the-box" do Maven, trabalharo para que tudo funcione.
agenda-online-1.0-dev.ear |- application.xml |- xerces-1.4.4.jar |- log4j-1.2.8.jar |- agenda-services-1.0-dev.jar - EJB e WAR possuem o agenda-services.jar | no seu CLASSPATH |- agenda-ejb-1.0-dev.jar | ` META-INF

| ` MANIFEST.MF ejb.jar no | | `- agenda-web-1.0-dev.war ` META-INF ` MANIFEST.MF


Listagem 14 - Estrutura do EAR no projeto Agenda On-line

- WAR manifest file possui o agendaseu CLASSPATH

<?xml version="1.0" encoding="ISO-8859-1"?> <project> <pomVersion>1</pomVersion> <groupId>agenda-online</groupId> <currentVersion>1.0-dev</currentVersion> <name>Projeto Agenda Online</name> <!-- ################################################################ --> <!-Seo de Gerenciamento do Projeto --> <!-- ################################################################ --> <organization> <name>Nki Technologies</name> <url>http://www.neki-technologies.com.br</url> <logo>http://www.neki-technologies.com.br/imagens/logo_neki.gif</logo> </organization> <inceptionYear>2003</inceptionYear> <package>br.com.neki.*</package> <distributionDirectory> ${maven.repo.local}/${pom.groupId}/${pom.artifactId}/ </distributionDirectory> <!-- ################################################################ --> <!-Seo de Dependncias do Projeto --> <!-- ################################################################ --> <dependencies/> <!-- ################################################################ --> <!-Seo de Construo do Projeto --> <!-- ################################################################ --> <build> <nagEmailAddress>fabiano.cruz@neki-technologies.com.br</nagEmailAddress> <sourceDirectory>${basedir}/src</sourceDirectory> <unitTestSourceDirectory>${basedir}/test</unitTestSourceDirectory> <unitTest> <includes> <include>**/Test*.java</include> </includes> <excludes> <exclude>**/*Test*All.java</exclude> </excludes> </unitTest> <resources/> <!-- (OPTIONAL) Resources packaged inside the JAR file. --> </build> <!-- ################################################################ --> <!-Seo de Relatrios do Projeto --> <!-- ################################################################ --> <reports/> </project>
Listagem 15 - Template de definio do Master Project

Construindo o JAR de Servio (Java Module)


A Listagem 16 apresenta a definio do projeto de Servio - um sub-projeto no Maven. Esse sub-projeto cria o arquivo agenda-services-1.0-dev.jar - uma biblioteca de dependncia utilizada por ambos, ejb e camada web. Repare na tag extends a referncia ao template do Master Project, apresentado na Listagem 15. Por ter estendido o pai, todas as propriedades sero herdadas. Ele ir definir os elementos dependency, indicando suas dependncias na API J2EE (que no foram definidas no pai) e ir sobrescrever o id, name e description definidos no pai.
<?xml version="1.0" encoding="ISO-8859-1"?> <project> <extend>${basedir}/../project.xml</extend> <id>agenda-services</id> <name>Agenda Services</name> <package>br.com.neki.service.*</package> <description>Servicos referentes ao Projeto Agenda Online</description> <shortDescription>Agenda Services JAR</shortDescription> <dependencies> <dependency> <groupId>j2ee</groupId> <artifactId>j2ee</artifactId> <version>1.3.1</version> </dependency> </dependencies> </project>
Listagem 16 - Definio do sub-projeto Agenda Services

Agora, vamos dar uma examinada no maven.xml do projeto Agenda Services. Tecnicamente falando, no precisaramos fazer absolutamente nada para gerar o jar desse projeto, bastando executar maven jar:install na linha de comando. Entretanto, como veremos mais na frente, existir um maven.xml que ir nos auxiliar, eliminando a execuo manual do Maven para todos os sub-projetos. Portanto, o maven.xml do projeto Agenda Services, ficaria assim:
<project default="main" xmlns:m="jelly:maven"> <goal name="main"> <attainGoal name="jar:install" /> </goal> </project>
Listagem 17 - maven.xml do sub-projeto Agenda Services

Construindo o WAR (Web Module)


Depois do ejb jar, hora do war. Gastaremos um tempinho a mais nessa seo. Primeiramente, iremos analisar o project.xml. Ento, iremos adicionar uma funcionalidade bsica, que ainda no existe no Maven WAR Plug-in. E por ltimo, veremos como fica o arquivo maven.xml. A Listagem 18 apresenta o project.xml da aplicao Web da Agenda. A atual definio do projeto possui muito mais dependncias para serem baixadas. Aqui, iremos mostrar as partes relevantes para ilustrar os conceitos. A parte importante a seo de dependncias. A aplicao Web depende das APIs J2EE providas pelo container em tempo de compilao, assim como de execuo. Entretanto, no h nenhuma

necessidade de empacotar a API J2EE dentro do WAR, uma vez que isso responsabilidade do servlet container. No mais, a aplicao web depende do JAR do Struts 1.1. Setando a propriedade <war.bundle>true</war.bundle>, indicar que o struts1.1.jar ser empacotado no WAR. Sempre que o WAR Plug-in receber a instruo de empacotar os jars, ele ir coloca-los dentro do diretrio WEB-INF/lib do WAR. Comparado cpia manual dos jars para o diretrio WEB-INF/lib, pelo Ant. O WAR tambm depende do arquivo jar do Agenda Services, agenda-services-1.0-dev.jar. Entretanto, no queremos copiar o jar para o WEB-INF/lib, uma vez que o mesmo uma biblioteca de dependncia compartilhada por ambos, camada web e ejb. Dessa forma, teremos setada a propriedade war.bundle como false para o arquivo agenda-services-1.0-dev.jar. Voc ter todas essas funcionalidades out of the box atravs do Maven WAR Plug-in.
<?xml version="1.0" encoding="ISO-8859-1"?> <project> <extend>${basedir}/../project.xml</extend> <id>agenda-web</id> <name>Aplicao Agenda Web </name> <package>br.com.neki.web.*</package> <description>Projeto Agenda Web</description> <shortDescription>Agenda web project</shortDescription> <dependencies> <dependency> <groupId>j2ee</groupId> <artifactId>j2ee</artifactId> <version>1.3.1</version> </dependency> <dependency> <id>xdoclet+web-module</id> <version>1.2b4</version> </dependency> <dependency> <groupId>struts</groupId> <artifactId>struts</artifactId> <version>1.1</version> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>agenda</groupId> <artifactId>agenda-services</artifactId> <version>${pom.currentVersion}</version> <properties> <war.bundle>false</war.bundle> <war.manifest.classpath>true</war.manifest.classpath> </properties> </dependency> </dependencies> </project>
Listagem 18 - Definio do sub-projeto Agenda Web

Entretanto, o Maven WAR Plug-in no possui uma caracterstica. Ele no possui a capacidade de setar o manifest classpath. Sem essa caracterstica, voc no poder utilizar bibliotecas de dependncia. Ento, acrescentaremos esse caracterstica no WAR Plug-in. Sero necessrias somente duas pequenas alteraes. Abra o plugin.jelly do WAR Plug-in em: C:/Documents And Settings/<login-id>/.maven/plugins/maven-war-plugin<version>-[SNAPSHOT]. Essas alteraes devem ser feitas na goal de nome war. Coloque o cdigo que segue abaixo, nessa goal.
<j:forEach var="dep" items="${pom.dependencies}"> <j:if test="${dep.getProperty('war.manifest.classpath')=='true'}">

<j:set var="maven.war.classpath" value="${maven.war.classpath} ${dep.artifact}"/> </j:if> </j:forEach>

Esse cdigo ir iterar em cima de cada dependncia descrita no project.xml (identificada pelo pom.dependencies) e ir checar se o war.manifest.classpath est setado como true. Caso sim, ele ir adicionar o nome do artefato na propriedade denominada maven.war.classpath. A segunda alterao que precisa ser feita quando o manifest file escrito. O manisfest file criado pelo Ant Plug-in, executando uma goal chamada manifest. O cdigo de criao do manifest apresentado abaixo. necessrio inserir a linha em negrito para setar o atributo manifest classpath. Que ir utilizar a propriedade maven.war.classpath setada acima.
<ant:manifest> <ant:attribute name="Built-By" value="${user.name}" /> <ant:attribute name="Class-Path" value="${maven.war.classpath}"/> <ant:section name="${pom.package}"> <ant:attribute name="Specification-Title" value="${pom.artifactId}" /> <ant:attribute name="Specification-Version" value="${pom.currentVersion}" /> <ant:attribute name="Specification-Vendor" value="${pom.organization.name}" /> </ant:section> </ant:manifest>

Simples, no !? :) Espero que isso o estimule a criar seus prprios plug-ins, quando for necessrio, ao invs de ficar adicionando, repetidamente, tarefas dentro de preGoals e posGoals. Abaixo, segue o maven.xml:
<project default="main" xmlns:m="jelly:maven"> <goal name="main"> <attainGoal name="war:install"/> </goal> </project>
Listagem 19 - maven.xml do sub-projeto Agenda Web

Construindo o EAR
At agora, voc viu como criar cada artefato individual que ir para dentro do EAR. Finalmente chegamos a ltima parte - construir o EAR propriamente dito. Voc pode imaginar que o EAR deveria ser construdo a partir da definio do projeto no topo da hierarquia, no nosso caso, na raiz do diretrio AgendaOnline, uma vez que o EAR um nico artefato para todo o projeto. Entretanto, no o caso. O EAR construdo como um artefato de um sub-projeto chamado ear (veja Listagem 13). Por que essa anomalia? Em primeiro lugar, o project.xml no nvel do projeto AgendaOnline um template para todos os outros sub-projetos estender. Se tivssemos que especificar as dependncias para construir o EAR, ento, isso resultaria em uma dependncia cclica aquela situao do ovo e da galinha - quando o template fosse estendido por outros sub-projetos. Se o template tivesse sido definido em outro lugar, provavelmente no nvel mais alto, logo o project.xml do diretrio AgendaOnline poderia produzir um EAR,

porm o mesmo no seria utilizado como um template para o restante dos sub-projetos estenderem. A Listagem 20 apresenta o project.xml para o projeto Agenda EAR. Na lista, voc poder ver as bibliotecas mais relevantes (que precisam de alguma explicao), o qual o ear depende.
01 <?xml version="1.0"?> 02 <project> 03 <extend>${basedir}/../project.xml</extend> 04 <id>agenda-online</id> 05 <name>Agenda EAR</name> 06 <description>Projeto Agenda EAR.</description> 07 <dependencies> 08 <dependency> 09 <groupId>j2ee</groupId> 10 <artifactId>j2ee</artifactId> 11 <version>1.3.1</version> 12 </dependency> 13 <dependency> 14 <groupId>xerces</groupId> 15 <artifactId>xerces</artifactId> 16 <version>1.4.4</version> 17 <properties> 18 <ear.bundle>true</ear.bundle> 19 </properties> 20 </dependency> 21 <dependency> 22 <groupId>${pom.groupId}</groupId> 23 <artifactId>agenda-services</artifactId> 24 <version>${pom.currentVersion}</version> 25 <properties> 26 <ear.bundle>true</ear.bundle> 27 </properties> 28 </dependency> 29 <dependency> 30 <groupId>${pom.groupId}</groupId> 31 <artifactId>agenda-web</artifactId> 32 <version>${pom.currentVersion}</version> 33 <type>war</type> 34 <properties> 35 <ear.bundle>true</ear.bundle> 36 <ear.appxml.ear.context-root>AgendaWeb</ear.appxml.ear.context-root> 37 </properties> 38 </dependency> 39 </dependencies> 40 </project>
Listagem 20 - Definio do sub-projeto Agenda EAR

Linha 33 - Type = war indicando que trata-se de um arquivo war. Isso ser setado no application.xml; Linha 36 - Coloca o context root para a aplicao web. Isso ser setado no application.xml;

Maven Multiproject Plug-in


Atravs do Reactor podemos utilizar o Maven para controlar a construo de mltiplos projetos. O Reactor faz uso do pacote Werkz para determinar a ordem correta das dependncias, definidas por cada projeto no seu respectivo POM. Essa ferramenta foi criada para encorajar a criao, ou refatoramento, de projetos em unidades menores, mais coerentes e discretas. O Reactor ideal para a Programao Orientada a Componentes (Component Oriented Programming - COP), onde o sistema

compreendido em vrias pequenas entidades que necessitam ser agregadas para formar o todo para ser distribudo. O Reactor pode executar uma lista arbitrria de goals para qualquer conjunto de projetos especificado. Sendo assim, apesar do Reactor ter sido criado para o building, o mesmo poder ser utilizado para a gerao do site, ou para a gerao de qualquer outro artefato escolhido. Propriedades do Multiproject Plug-in:
Propriedade maven.multiproject.aggregateDir maven.multiproject.basedir maven.multiproject.excludes maven.multiproject.ignoreFailures maven.multiproject.includes maven.multiproject.navigation maven.multiproject.overviewPage.create maven.multiproject.overviewPage.title maven.multiproject.overviewPage.link maven.multiproject.overviewPage.linkTitle maven.multiproject.overviewPage.text maven.multiproject.type maven.multiproject.overviewPage.text Tabela 02 - Propriedade do Maven Multiproject Plug-in Descrio //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 auxlio do Maven ficou simples gerar a documentao do projeto atravs de um site, sendo facilmente mantida atualizada e consistente com as informaes e propriedades do projeto. Na documentao gerada podemos encontrar a lista de desenvolvedores, mailling list, dependncias do projeto, relatrios de cobertura dos testes unitrios, relatrios de mtricas aplicadas nos cdigos fonte, change logs, JavaDocs, duplicidade de cdigo, relatrio sobre anlise da padronizao dos cdigos fonte, entre outras. Alm disso, criado um menu de navegao para orientar a equipe percorrer toda a documentao do projeto. Para criar esse menu simples, basta adicion-lo ao diretrio "xdocs" do projeto. O diretrio xdocs local onde so armazenados os arquivos para a construo dos HTML estticos para o site do projeto. Esses arquivos so XML's que contm informaes que desejam fazer parte da documentao do projeto, sendo transformados em arquivos HTML. Usando arquivos XML como "porta de entrada" para as informaes, torna-se fcil mudar o look and feel completo do site, ou gerar a documentao do projeto em outros formatos de arquivos (PDF). Os arquivos XML contm algumas tag's prprias

para a gerao da documentao atravs do Maven, mas podem conter tambm tags HTML (isso essencial). Para dar incio a gerao da documentao do projeto, obtendo as descries que existem nos vrios arquivos XML que definem a estrutura do site, alm das informaes e propriedades do projeto e dos possveis relatrios, basta executar o comando:
> maven site:generate

O resultado produzido por esse comando a criao do diretrio target/docs dentro do diretrio base do seu projeto (no mesmo nvel do diretrio xdocs). Este diretrio conter todo o site do projeto com a documentao gerada. Caso voc tenha a responsabilidade de ser o mantenedor do site do projeto, pode usar o Maven para publicar o site gerado diretamente no Servidor Web. Isso uma tarefa simples para o Maven, que ir usar as configuraes que esto definidas no descritor do projeto (project.xml), para especificar as vrias configuraes como hostname do Servidor Web e diretrio onde o site residir, pois so informaes relevantes para o deployment. Para isso basta executar o comando:
> maven site:deploy

Assumindo que voc tenha acesso ao Servidor Web, o site gerado ser publicado. Isso alterar o site do projeto de uma forma fcil e simples. Isso pode tambm ser facilmente automatizado. Goals:
Goal xdoc xdoc:generatefrom-pom init-dvsl-tag Description A goal padro. Esta goal simplesmente executa o xdoc:generate-from-pom e xdoc:transform. Gera um conjunto de relatrios a partir do arquivo project.xml. Isto inclui dependncia, mailing list, project info, reports e lista da equipe. Esta goal define a tag library DVSL para gerao de documentao. A definio da tag dvsl:dvsl.

CONFIGURAES
Uma das primeiras configuraes a criao de um simples navigation.xml, que conter a estrutura do menu para navegar pela documentao. Para isso basta adicionar todos os itens e sub-itens que representem os arquivos HTML gerados a partir dos arquivos XML. Os itens podem ser expandidos ou no, dependendo da sua navegao. Para isso adicione collapse="true" na declarao do item. Exemplo:
<?xml version="1.0" encoding="ISO-8859-1"?> <project name="Maven Xdoc Plugin"> <title>Maven Xdoc Plugin</title> <body> <menu> <links> <item name="Maven"

href="http://maven.apache.org/"/>

</links> <item name="Alpha" href="/alpha/index.html"> <item name="Alpha One" href="/alpha/one/index.html"/> <item name="Alpha Two" href="/alpha/two/index.html"/> </item> <item name="Beta" href="/beta/index.html" collapse="true"> <item name="Beta One" href="/beta/one/index.html" collapse="true"/> <item name="Beta Two" href="/beta/two/index.html" collapse="true"/> </item> </menu> </body> </project>

Para adicionar uma imagem a um item de navegao basta adicionar a opo img:
<item name="The Site" href="http://www.thesite.net/" img="http://www.thesite.net/thesite.png"/>

Podem ser adicionadas configuraes para o Maven atravs do arquivo project.properties que se encontra em ${project.home}:
Propriedade maven.ui.body.background maven.ui.body.foreground maven.ui.section.background Opcional? Descrio Sim Sim Sim Especifica a cor de background color usada para o body de cada pagina. O valor default #fff (branco). Especifica a cor de foreground usada para o body de cada pgina. O valor default #000 (preto). Especifica a cor de background usada nos headers de primeiro nvel das sees. O valor default #036 (dark blue). Especifica a cor de foreground usada nos headers de primeiro nvel das sees. O valor default #fff (branco). Especifica a cor de background usada nos headers de segundo nvel das sees. O valor default #888 (gray). Especifica a cor de foreground usada nos headers de segundo nvel das sees. O valor default #fff (branco). Especifica a cor de background usada nas linhas de header das tabelas. O valor default #bbb (gray). Especifica a cor de foreground usada nas linhas de header das tabelas. O valor default #fff (branco). Especifica a cor de background usada nas linhas mpares da tabela. O valor default #ddd (gray). Especifica a cor de foreground usada nas linhas mpares da tabela. O valor default #000 (preto). Especifica a cor de background usada nas linhas pares da tabela. O valor default #ddd (gray). Especifica a cor de foreground usada nas linhas pares da tabela. O valor default #000 (preto). Especifica a cor de background usada no banner. O valor default #036 (dark blue). Especifica a cor de foreground usada no banner. O valor default #fff (branco). Especifica a cor usada para o borda superior do banner. O valor default #369 (azul).

maven.ui.section.foreground

Sim

maven.ui.subsection.background

Sim

maven.ui.subsection.foreground

Sim

maven.ui.table.header.background maven.ui.table.header.foreground maven.ui.table.row.odd.background maven.ui.table.row.odd.foreground maven.ui.table.row.even.background maven.ui.table.row.even.foreground maven.ui.banner.background maven.ui.banner.foreground maven.ui.banner.border.top

Sim Sim Sim Sim Sim Sim Sim Sim Sim

maven.ui.banner.border.bottom maven.ui.source.background maven.ui.source.foreground maven.ui.source.border.top maven.ui.source.border.bottom maven.ui.source.border.right maven.ui.source.border.left maven.ui.navcol.background

Sim Sim Sim Sim Sim Sim Sim Sim

Especifica a cor usada para o borda inferior do banner. O valor default #003 (preto). Especifica a cor usada no background dos source regions. O valor default #036 (dark blue). Especifica a cor usada para foreground dos source regions. O valor default #fff (branco). Especifica a cor usada na borda superior dos source regions. O valor default #888 (gray). Especifica a cor usada na borda inferior dos source regions. O valor default #888 (gray). Especifica a cor usada na borda do lado direito dos source regions. O valor default #888 (gray). Especifica a cor usada na borda do lado esquerdo dos source regions. O valor default #888 (gray). Especifica a cor usado para background na coluna de navegao que fica no lado esquerdo da pgina. O valor default #eee (gray). Especifica a cor usada para foreground na coluna de navegao que fica no lado esquerdo da pgina. O valor default #000 (black). Especifica a cor usada na borda superior da coluna de navegao. O valor default #fff (branco). Especifica a cor usada na borda do lado direito da coluna de navegao. O valor default #aaa (gray). Especifica a cor usada na borda inferior da coluna de navegao. O valor default #aaa (gray). Especifica a cor usada para background na barra horizontal de navegao lacalizada imediatamente abaixo do banner (esse elemento no aparecer caso a pgina no tenha links especificados). O valor default #ddd (gray). Especifica a cor usada para foreground na barra horizontal de navegao localizada imediatamente abaixo do banner (esse elemento no aparecer caso a pgina no tenha links especificados). O valor default #000 (preto). Especifica a cor usada na borda superior da seo horizontal de navegao. O valor default #fff (branco). Especifica a cor usada na borda inferior da seo horizontal de navegao. O valor default #aaa (gray). Especifica a cor usada para todos os links. O valor default azul. Especifica a cor usada para todos os links quando estes esto ativos. O valor default #f30 (vermelho).

maven.ui.navcol.foreground

Sim

maven.ui.navcol.border.top maven.ui.navcol.border.right maven.ui.navcol.border.bottom maven.ui.breadcrumbs.background

Sim Sim Sim Sim

maven.ui.breadcrumbs.foreground

Sim

maven.ui.breadcrumbs.border.top

Sim

maven.ui.breadcrumbs.border.bottom Sim

maven.ui.href.link maven.ui.href.link.active

Sim Sim

Propriedades de organizao de diretrios Propriedade maven.docs.dest maven.docs.src maven.gen.docs Opcional? Descrio Sim Sim Sim Especifica a localizao dos arquivos gerados a partir do xdocs. O valor default ${maven.build.dir}/docs. Especifica a localizao da documentao "xdocs" do projeto. O valor default ${basedir}/xdocs. Especifica a localizao onde os arquivos xdocs do Maven so armazenados. Esses arquivos depois so transformados para HTML. O valor default ${maven.build.dir}/generated-xdocs.

Outras Propriedades maven.xdoc.crumb.separator maven.xdoc.date Sim Sim Separador entre links. O padro | Permite o usurio mostrar a data de gerao do site. Essa data pode ficar em 5 lugares diferentes com o "maven.xdoc.date": left righ navigation-top navigation-bottom bottom

Se "maven.xdoc.date" esta vazio, nenhuma data mostrada no site. O "maven.xdoc.date.locale" tem como default o "en" (ex.: english). maven.xdoc.date.format Sim Configura o formato da data que ser mostrada. O padro "dd MMMM yyyy" (ex.: "14 August 2002"). Para detalhes sobre formatao veja SimpleDateFormat na documentao do JDK. Configura o locale usado para data. Padro "en". Configura o nome da imagem usada (veja images/logos). O valor default a logo de Stphane Mor. Configura o ttulo do link para a logo de powered. O Padro "Powered by Maven". Configura o link para a logo de powered. O padro "http://maven.apache.org/" O JSL stylesheet usado para converter xdocs para HTML. Para sobrescrever especifique-o como um arquivo: URL.

maven.xdoc.date.locale maven.xdoc.poweredby.image

Sim Sim

maven.xdoc.poweredby.title maven.xdoc.poweredby.url maven.xdoc.jsl

Sim Sim Sim

Organizao das documentaes geradas:


Diretrio target/ Contedo Contem classes compiladas e JARs. Contem classes compiladas e JARs. Contm as classes de teste unitrios compilados. Contm as classes compiladas para os testes unitrios de integrao. Contm os xdocs gerados pelo Maven Comentrios O contedo do diretrio target deve ser muito utilizado no projeto. Este diretrio contem os JAR's gerados. O diretrio target/classes contm todas as classes compiladas. Este diretrio usado para empacotar o JAR final para o projeto. O diretrio target/test-classes contm todas as classes dos testes unitrios compiladas. Este diretrio usado quando executados os testes unitrios. O diretrio target/iutest-classes contm todas as classes dos testes unitrios de integrao compilados. Este diretrio usado durante a execuo dos testes unitrios de integrao. O diretrio target/generated-docs contm todas os xdocs gerados pelo Maven. Todo o contedo gerado pelo Maven primeiro convertido para o formato xdoc, ento o mesmo stylesheet usado para transformar o resto do site pode ser usado para gerar o contedo. O contedo para este diretorio transformado e armazenado no diretrio docs. O diretrio test-reports/ contm os relatrios

target/classes

target/test-classes

target/iutest-classes

target/generated-docs

target/test-reports

Contm os resultados

individuais dos testes unitrios.

individuais dos testes unitrios em ambos os formatos XML e texto. Os relatrios existentes nesse diretrio usado quando o Maven cria o relatrio final sobre os testes unitrios. O diretrio docs contm somente as documentaes geradas com a inteno de ser publicadas no site do projeto. Este diretrio inclui os arquivos HTML, JavaDocs, crossreferenced sources e vrios relatrios gerados. Geralmente toda a documentao armazenada no diretrio xdocs e ento transformada para o seu respectivo diretrio.

target/docs

Arquivos de documentao para o site a ser publicado.

target/docs/index.html

A pgina inicial para Se o projeto no contm uma pgina index.html sobre a documentao no diretrio xdocs, ento o Maven do projeto. automaticamente cria uma pgina simples baseada nas informaes descritas nos elementos do descritor do projeto. API da documentao. Os JavaDocs do projeto so gerados automaticamente usando o utilitrio JavaDoc. Colocando a documentao da API no diretrio docs/apidocs faz com que seja fcil referenciar outras documentaes que estejam no diretrio docs e vice-versa. Referncia para o cdigo fonte. O Maven gera automaticamente as referncias para os cdigos fontes que permite uma navegao fcil atravs da estrutura de fontes. Colocando esses referncias no diretrio docs/xref/ fcil referenciar a documentao da API e vice-versa. O Maven gera automaticamente as referncias para os cdigos fontes dos teste, mostrando aos desenvolvedores como usar o software apropriadamente de uma forma fcil. O Maven gera automaticamente a lista de mailing lists baseada nas informaes providas pelo descritor do projeto. O Maven gera automaticamente a lista dos membros da equipe baseada nas informaes providas pelo descritor do projeto. O Maven automaticamente gera a lista de dependncias do projeto baseada nas informaes providas pelo descritor do projeto. O Maven gera automaticamente o log de alteraes a partir do log de mensagens do CVS. Este log atualmente limitado para os ltimos 30 dias. O Maven gera automaticamente um log a partir dos arquivos alterados nos ltimos 30 dias que esto em seu SCM. O Maven gera automaticamente um log a partir dos arquivos alterados nos ltimos 30 dias que esto em seu SCM por desenvolvedor. O Maven gera automaticamente um relatrio com vrias mtricas de analise sobre os cdigos fontes. Estes relatrios facilitam a viso completa do projeto. O Maven gera automaticamente relatrios com resultados dos testes unitrios.

target/docs/apidocs

target/docs/xref

target/docs/xref-test

Referncia de testes para o cdigo fonte.

target/docs/mail-lists.html

Documentao sobre o Mailing list. A lista da equipe do projeto. A lista das dependncias. O log de alteraes registradas no CVS.

target/docs/team-list.html

target/docs/dependencies.html

target/docs/changelog.html

target/docs/file-activityreport.html target/docs/developer-activityreport.html target/docs/jdependreport.html

Relatrio das alteraes por arquivos. Relatrio das atividades dos desenvolvedores. Relatrio de mtricas.

target/docs/junit-report.html

Relatrio dos testes unitrios.

target/docs/checkstylereport.html

Relatrio do Checkstyle.

O Maven gera automaticamente um relatrio com os resultados do Checkstyle. Com este relatrio poder ser analisado se as convenes adotadas para o projeto esto sendo seguidas.

RELATRIOS
Atravs da utilizao do Maven, vrios relatrios podem ser gerados automaticamente, provendo conjunto de informaes relevantes sobre o projeto, tanto para as equipes tcnica, de qualidade ou gerencial. Isto feito facilmente com a incluso da tag reports no descritor do projeto. Mas o uso dessa tag no obrigatrio, onde a supresso de seu uso faz com que um conjunto de relatrios padro seja gerado. Com essa tag, voc pode incluir ou excluir determinados tipos de relatrios que so gerados com a utilizao de plugins do Maven, todos esses so adicionados no menu de navegao na ordem em que so adicionados. Esses relatrios so gerados atravs do comando maven site. No project.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 gerao de um determinado relatrio deve ser feito utilizando o seguinte valor na tag "report": maven-xyz-plugin. O conjunto padro de relatrios definido no plugin xdoc o qual tem como valor padro 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 padro de relatrios, mas adicionar algum em especial, ou retirar algum, a melhor forma de fazer isso usar postGoal para xdoc:register-reports.
<postGoal name="xdoc:register-reports"> <attainGoal name="maven-changelog-plugin:deregister"/> <attainGoal name="maven-meu-plugin:register"/> </postGoal>

A documentao dos sites que agregam um conjunto de subprojetos e que devem conter a incluso completa da documentao do projeto como sees na barra de navegao de seus sites. Isto pode ser feito com a configurao da propriedade maven.xdoc.includeProjectDocumentation com o valor de "no". Por padro o Maven icluir a documentao do projeto na seo da barra de navegao com a qual incluir informaes sobre o projeto to quanto links para os numerosos relatrios gerados pelo prprio Maven. //TODO: rever!

MAVEN XDOC PLUGIN


O plugin XDoc o principal mecanismo utilizado para produzir a documentao do projeto gerado pelo Maven, to quanto qualquer informaes fornecida pela equipe no "xdocs". Um "xdoc" um arquivo XML composto por pequenos e simples conjuntos de tags. O Maven utiliza esse formato por completo, onde os relatrios gerados so primeiramente gerados como um "xdoc", os quais ento so transformados em HTML atravs desse plugin. Isso feito com o uso de Jelly/JSL que transformam arquivos XML em HTML. Todos os arquivos XML existentes no diretrio so convertidos utilizando JSL. Os arquivos que no so XML e/ou sub-diretrios so copiados sem modificao, com isso permitido a incluso de outros tipos de documentos (incluso de imagens). Os arquivos HTML gerados automaticamente herdam o look-and-feel padro do Maven. Os arquivos XML devem ser compostos de sintaxe XML/XHTML que sejam passveis de "parser" padro para XML (Xerces). Exemplo:
<?xml version="1.0"?> <document> <properties> <author email="nospam.AT.foo.DOT.com">Jon S. Stevens</author> <author email="mrsmith.AT.foo.DOT.com">Mr. Smith</author> <title></title> </properties> <meta name="keyword" content="jakarta, 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.</li> </ul> </section> <section name="Section 2"> <p>This is section 2.</p> <ol> <li>This is an ordered list.</li> </ol> </section> <section name="Section 3"> <p>This is section 3.</p> <source> Anything within this tag is rendered as a "box" with blue lines and &lt;pre&gt;&lt;/pre&gt; tags around it. </source>

<subsection name="Subsection of Section 3"> <p>This is the subsection 3.</p> </subsection> </section> </body> </document>

Explicando algumas coisas:


possvel ter uma ou mais tags <author> possvel ter uma ou mais tags <section> Dentro da tag <section> possvel ter uma ou mais tags <p>. Qualquer tipo de texto deve estar entre tags <p> e pode conter outras marcaes XHTML. Tag <meta> so colocadas como tags dentro da <document> e vo direto para o arquivo html. Tags <source> so especiais, existem somente dentro das tags <section> e <subsection>. Se estiver utilizando outras marcaes XML/XHTML dentro das tags source, ento necessrio utilizar CDATA. Exemplo: <source><![CDATA[contedo foo]]></source> No exemplo do arquivo xml, estamos utilizando a tag <pre> e podemos ver que esta no precisa estar em uma CDATA.

Voc pode utilizar a tag footer para incluir texto ou imagens abaixo do menu de navegao e acima do aviso de copyright. Esta tag tem somente uso no arquivo navigation.xml e deve ser colocada dentro do elemento body. Exemplo:
<footer> <A href="http://sourceforge.net/projects/ctecl"> <IMG src="http://sourceforge.net/sflogo.php?group_id=72748" border="0" alt="sf logo"/> </A> </footer>

Se o elemento search encontrado dentro do body do arquivo navigation.xml, uma opo de pesquisa gerada no menu de navegao, a qual usar o google.
<project name="foo"> <body> <menu name="bar"> <search/> </body> </project>

...

</menu>

Adicionando mais usabilidade aos xdocs, podem ser includos outros tipos de arquivos como imagens, arquivos HTML, PDF's etc. Por padro este plugin copiar todos os arquivos localizados no diretrio maven.docs.src para a gerao final do site. Caso seja criado um style/project.css abaixo de maven.docs.src, ele ser copiado para a rvore de documentos e importado para dentro de cada pgina (via @import). Isto permite voc facilmente adicionar e modificar os styles providos pelo Maven.

EXEMPLOS DE REPORTS
Changes: Com esse relatrio voc pode navegar por todo o site do projeto e ter um resumo de todas as alteraes que ocorrem. Com isso as alteraes que ocorrem diariamente, a

cada dois dias ou semanalmente (a partir de suas configuraes) podem ser acompanhadas e ver o que esta acontecendo de novo. Para habilitar esse relatrio, necessrio criar o arquivo changes.xml no diretrio xdocs. O formato para esse arquivo o seguinte:
<?xml version="1.0"?> <document> <properties> <title>Changes</title> <author email="vmassol@octo.com">Vincent Massol</author> </properties> <body> <release version="1.5" date="in CVS"> <action dev="vmassol" type="add" due-to="Jason Robertson" due-to-email="Jason.Robertson@acs-inc.com"> Added Form-based authentication support (Submitted by Jason Robertson). </action> <action dev="vmassol" type="add"> Added a <link href="howto_build.html">tutorial</link> that explains how to build Cactus from the sources. </action> [...] </release> </body> </document>

O atributo "type" pode ser add, remove update ou fix. Para adicionar esse relatrio:
maven-changes-plugin

Exemplo:

Developer Activity: Identifica cada desenvolvedor e seu commits e arquivos alterados. Para adicionar esse relatrio:
maven-developer-activity-plugin

Exemplo:

File Activity: Identifica o nome do arquivo e a quantidade de vezes que ele foi alterado. Para adicionar esse relatrio:
maven-file-activity-plugin

Exemplo:

Task List: Identifica a classe, a quantidade de "TODO's" e os mtodos com "TODO". Para adicionar esse relatrio:
maven-tasklist-plugin

Exemplo:

MTRICAS
Durante o desenvolvimento de um produto de software, procedimentos de medio e anlise de dados quantitativos permitem que se obtenha informaes objetivas quanto qualidade do produto em construo e possibilitam um controle preciso da evoluo do projeto. No contexto de uma organizao produtora de software, o uso de medies permite que se tenha um melhor conhecimento da eficcia do processo de desenvolvimento, atravs do acompanhamento quantitativo de diversos aspectos como produtividade, evoluo da qualidade de produtos desenvolvidos, acurcia de estimativas, entre outros. Em primeiro lugar, devido quantidade e complexidade dos fatores envolvidos no desenvolvimento de um software de grande porte, h tantos aspectos a serem medidos que torna-se necessrio selecionar apenas um subconjunto restrito, de forma a viabilizar as atividades de coleta e anlise. Sem uma poltica bem definida para definio desse subconjunto de mtricas, a probabilidade de se escolher arbitrariamente as mtricas mais adequadas muito remota. Uma vez modelado o processo de desenvolvimento e alguns conceitos utilizados na medio, possvel definir as medidas a serem coletadas. So definidas as medidas explcitas (obtidas diretamente), a partir das quais se pode construir medidas derivadas. Um exemplo de medida explcita o registro de defeitos. Um defeito pode ser definido como qualquer problema ou imperfeio encontrado em um produto ou artefato de software, cuja correo implique na alterao de pelo menos um artefato produzido. So

considerados defeitos apenas os problemas decorrentes de erros cometidos por membros da equipe de desenvolvimento. Alteraes de requisitos solicitadas pelo cliente ou usurio no so consideradas defeitos, sendo tratadas parte. Durante o ciclo de vida do projeto, devem ser registrados todos os defeitos encontrados.

Objetivos
Procedimentos de coleta e anlise de mtricas envolvem geralmente uma grande quantidade de informao, principalmente no contexto dos grandes projetos de software. Nesses casos, a coleta e anlise manual dos dados tornam-se inviveis, tanto pelo risco de erros decorrentes de falhas humanas, quanto pelo custo envolvido. A existncia de ferramentas automatizadas que dem suporte a essas atividades torna-se, portanto, essencial. Este trabalho prev, alm da definio da poltica de medio, o uso de uma soluo que oferea apoio informatizado gesto das mtricas escolhidas. A soluo ser composta de dois mdulos principais:
Um mdulo de coleta, que engloba funcionalidades que oferecem suporte realizao das medies, armazenando os resultados obtidos em relatrios que se encontram no site do projeto. Um mdulo de anlise, que contempla recursos para a visualizao grfica dos indicadores quantitativos e mtodos estatsticos para o processamento das mtricas, com o objetivo de oferecer apoio ao trabalho de anlise do resultado das medies.

Plugin's
Jdepend - http://www.clarkware.com/software/JDepend.html Analisa classes Java e gera mtricas sobre a qualidade do "Design" para cada package Java. JDepend permite a equipe de Qualidade automaticamente mensurar a qualidade do "Design" em termos de suas extensibilidades, reusabilidade e manutenibilidade para controle efetivo das dependncias dos packages Java. Segue abaixo uma viso geral do uso dessa mtrica: O objetivo dessa anlise verificar o design se esta flexvel, interdependente e fcil de manuteno. Algumas formas de dependncia so desejadas, enquanto outras no. Simplesmente por usar modelagem OO pode ser insuficiente para obter robustez, manutenibilidade e reusabilidade. Existem outros atributos que so requeridos, como pattern de interdependncia entre design de sub-sistemas, isolar elementos reusveis de elementos no reusveis e blocos de propagao de mudana em manuteno. Para adicionar esse plugin:
maven-jdepend-plugin

Exemplo:

PMD - http://pmd.sourceforge.net uma ferramenta que analisa os arquivos "java" e procura por problemas de relativa importncia, tais como:
Variveis locais que no declaradas. Blocos catch que estejam vazios. Parmetros que no so usados. Blocos de IF's sem preenchimento. Imports duplicados. Mtodos privados que no estejam sendo utilizados. Classes que poderiam ser Singletons.

Essa ferramenta utiliza a abordagem de "Rules", ou seja, so configuradas as principais/qualquer "best pratices" que dever ser seguida pela equipe de desenvolvimento. O conjunto de "Rules" pode ser estendido, atravs da criao de novos verificadores. Para isso basta criar uma nova rule/verificador utilizando uma expresso em XPath. Alguns exemplos de "Rules" analisadas pelo PMD:
EmptyCatchBlock EmptyIfStmt EmptyWhileStmt EmptyTryBlock UseSingletonRule JUnitAssertionsShouldIncludeMessageRule JUnitSpelling ExcessiveImportsRule

CPD:

Desenvolvido como um plugin ao PMD, tem como objetivo analisar cdigos Java e identificar as classes que contm duplicidade em cdigo. Anlogo ao Simbian (ver abaixo), mas no to efetivo em sua analise, tendo como um dos seus principais problemas identificados no seu uso o no apontamento onde ocorreu a duplicidade de cdigos entre classes. Para adicionar esse plugin:
maven-pmd-plugin

Exemplo:

Clover - http://www.thecortex.net/clover Essa ferramenta abrange todos os teste unitrios, analisando a cobertura dos testes para as classes relacionadas, executando uma interao com as classes de testes do JUnit. Aps a cobertura dos testes gerado um relatrio com a analise focada em cada classe dos packages existentes. Dessa forma, possibilita a equipe de qualidade analisar os testes que esto sendo desenvolvidos, a qualidade de cada e se esta apto a atender a necessidade a serem analisadas. De posse dos relatrios os testes podem ser analisados e sofrer refactoring para que possam cobrir por completo os testes especificados. O uso desse dessa ferramenta no ciclo de integrao continua mantm a equipe de qualidade com informaes atualizadas sobre o quo esto os testes da equipe de desenvolvimento cobrindo as classes desenvolvidas, descobrindo possveis bugs existentes.

Para adicionar esse plugin:


maven-clover-plugin

Exemplo:

Simian - http://www.redhillconsulting.com.au/products/simian/index.html Um analisador de cdigo Java com o intuito de localizar duplicidade em cdigo. Auxilia na atividade de "refactoring" como um guia, apontando as classes que contm cdigo repetido. Aes do tipo "copiar e colar" que so freqentes entre desenvolvedores e um atraente modo de propagao de erros que dificilmente so identificados pelos testes unitrios. O Simbian identifica essas duplicaes que em sua grande maioria apontam erros em design e acoplamentos no desejados na modelagem. Para adicionar esse plugin:
maven-simian-plugin

Exemplo:

CheckStyle - http://checkstyle.sourceforge.net Uma ferramenta desenvolvida para auxiliar desenvolvedores a escreverem cdigo Java que estejam de acordo com uma padro estabelecido pela equipe de Qualidade. O processo de checagem do cdigo fonte passa a ser executado de forma automatizada, tornando-se ideal para projetos que pretendem manter a padronizao de cdigo, garantindo qualidade e legibilidade de cdigos Java. Configurao simples e flexvel, suportando todas as padronizaes de cdigo e podendo seguir as convenes da SUN Microsystems. Alguns exemplos de verificaes executadas pelo CheckStyle:
Comentrios Javadoc Conveno de nomes Headers Imports Size Violations Whitespace Modifiers Blocks Problemas de codificao Class Design Cdigo duplicado Checagem de mtricas Checagem personalizada

Para adicionar esse plugin:


maven-checkstyle-plugin

Exemplo:

TESTES
EXECUTANDO TESTES UNITRIOS
//TODO

MAVENIDE
Como vimos, o Maven foi criado para facilitar a vida dos desenvolvedores provendo uma estrutura bem definida para o projeto, atravs de um processo bem definido que deve ser seguido e uma gama de documentao consistente que mantm de desenvolvedores a clientes, informados no que est acontecendo no projeto. Podemos dizer que o Maven alivia muitas tarefas que consideramos rduas e que teriam que ser "feitas na mo". Para alcanar esse o objetivo, o Maven utiliza-se do conceito do POM (Project Object Model), um arquivo XML que descreve, dentre outras coisas, o layout do projeto. No outro lado temos as IDEs Java, com a sua prpria maneira de representar as configuraes necessrias a construo do projeto. Dessa forma, temos uma discrepncia que torna difcil a manuteno do projeto e o sincronismo entre essas partes.

Mavenide procura integrar o Maven nas IDEs padro de mercado. Existindo um nmero significativo de coisas que podem ser feitas, como: edio do POM, sincronizao entre a IDE e POM, executar o Maven de dentro da IDE, prover wizards para a "mavenizao" de projetos, gerenciar as propriedades de tempo de execuo do Maven etc.

Instalao
Uma vez baixado, um plug-in normalmente instalado no Eclipse fazendo um unzipping dos arquivos baixados e copiando o contedo dos mesmos para o diretrio plug-ins e features do Eclipse. Nesse caso, o arquivo mevenide.update_0.0.1.jar deve ser unzipado dentro do diretrio 'raiz' do Eclipse (ele automaticamente cair no diretrio de plug-ins e features), enquanto que os arquivos: org.mevenide.config_0.1.jar, org.mevenide.core_0.1.1.jar, org.mevenide.grabber_0.1.1.jar, org.mevenide.ui_0.1.1.jar, necessitam ser unzipado diretamente no sub-diretrio plugins do Eclipse. Por ultimo, o arquivo org.mevenide.feature_0.1.1.jar, dever ser unzipado diretamente no sub-diretrio features do Eclipse. Por segurana, voc deve fazer o unzip em um diretrio temporrio e copiar para um diretrio apropriado dentro do Eclipse. Se o Eclipse estiver sendo executado, voc precisar parar e restartar para que os plug-ins sejam reconhecidos.

Configuraes
Antes de utilizarmos o MavenIDE, deveremos configur-lo adequadamente. Faremos isso, atravs da pgina de preferncias do Maven. Em Window > Preferences > Maven. Java Home, Maven Home e Maven repository so informaes requeridas para executarmos com sucesso o MavenIDE. Um template para o POM tambm poder ser especificado. Ele ser utilizado na como esqueleto na criao de novos POMs. Se voc quiser, tambm poder checar a opo 'Check timestamp before syncronizing', que ir verificar o timestamp do project.xml ou .classpath do projeto. Isso ir prevenir problemas de sobrescrita de arquivos de configurao. Por ltimo, voc poder especificar uma goal default a ser executada para todos os projetos.

Figura 01 - Maven Preferences

Para executar scripts a partir do Eclipse, utilizando o MavenIDE, basta clicar com o boto direito do mouse no POM (Project Object Model - project.xml) e no 'MavenIDE Menu', clique na opo 'Run Maven...'. Como segue abaixo:

Figura 02 - MavenIDE Menu

Quando voc seleciona a opo 'Run Maven...' do Maven menu, um wizard ir aparecer para que voc coloque as informaes relevantes no contexto da IDE (isso significa que, opes como -b, -h, -p, entre outras, no esto acessveis). As propriedades de sistema podero ser especificadas utilizando o boto 'Add'. A caixa de texto na parte inferior do wizard poder ser editada e nela iremos colocar as goals que sero executadas. A tabela utilizada para passarmos propriedades do sistema para o Maven.

Figura 03 - Wizard de execuo do Maven

Voc tambm poder utilizar o atalho do Eclipse, em Run > External Tools > Run As > Maven Project. Esse comando ir executar a goal default especificada na pgina de preferncias.

Figura 04 - Atalho para execuo do Maven

Podemos visualizar o output da operao na prpria console de debug do Eclipse, dada a inexistncia de uma console para o Mavenide (verso atual).

POM Synchronization
Mavenide POM Synchronization basicamente uma nica pgina, composta de dois elementos:
Uma aba, onde o usurio ir especificar qual artefato ser colocado dentro do POM; E a outra, permite que o usurio especifique toda o status das dependncias existentes no POM

Source Directory Synchronization


Uma vez que o POM contm muito mais informaes que o Eclipse .classpath, quando estivermos sincronizando o POM, precisaremos prover algumas informaes adicionais.

Para toda Eclipse SourceFolder, o tipo do Maven Source Directory tem que ser especificado atravs da pgina do wizard Maven Source Directory Mapping. O usurio dever declarar se existe ou no herana. Se no existir herana, ento a checkbox (terceira coluna) ficar desabilitada.

Figura 03 - Pgina do wizard Maven Source Directory Mapping

Dependency Synchronization
Mavenide prove um mecanismo automtico de resoluo das dependncias, podendo determinar de maneira precisa o groupId, artifactId e version de uma determinada dependncia. Ele pode falhar, ento o usurio poder auxili-lo utilizando a pgina do wizard Dependency Mapping. Note tambm que se a biblioteca nao estiver instalada no repositrio local, seu groupId no ser resolvido, mas o mesmo ser assinalado com nonResolvedGroupId e uma key ser adicionada ao project.properties fazendo uso da facilidade do Maven jar overriding.

Figura 04 - Pgina do wizard Dependency Mapping

Mavenide prove o suporte a dependncias de propriedades atravs da caixa de dilogo Dependency Properties que poder ser acessada pressionando o boto "Properties".

Feedback
Por favor, d a sua opinio a respeito do contedo apresentado. Correes, sugestes ou qualquer outra informao relevante de suma importncia para ns e ser muito bem vinda. Contato: owner@hotwork.dev.java.net

Você também pode gostar