Você está na página 1de 13

GUJ

http://www.guj.com.br

Automatizando seus projetos com o Maven 2


Maurcio Linhares de Arago Junior
Automatize toda a gerncia do ciclo de vida dos seus projetos Java utilizando o Maven 2

Introduo
O Maven uma ferramenta de gerncia e compreenso de projetos. Mas o que seriam a gerncia e
compreenso de projetos? O Maven gerencia projetos desde a sua criao (com a gerao do esqueleto
inicial do sistema) at a sua implantao em um servidor (remoto ou no).
E a compreenso do projeto? O Maven mantm todas as informaes do projeto em um nico lugar, o
Project Object Model (POM), que o arquivo de configurao do projeto onde so definidas todas as
suas caractersticas. No POM so definidas desde informaes bsicas do projeto, como nome,
desenvolvedores, repositrios de cdigo fonte (sistemas de controle de verso, como CVS e Subversion),
como suas dependncias em bibliotecas externas e at mesmo plugins do prprio Maven que so
utilizados para facilitar a vida dos desenvolvedores, como um servidor web embutido que executa
diretamente de dentro do projeto.
Alm de tudo isso, o Maven uma ferramenta que prega a padronizao dos projetos. Se voc
conhece a estrutura de um projeto bsico do Maven, no vai ter problemas para entender outro projeto
que tambm siga a mesma estrutura e isso diminui drasticamente o tempo que o desenvolvedor vai levar
para entrar no novo sistema, pois ele no vai precisar entender uma nova estrutura ou aprender novos
conceitos.
O Maven tambm segue a premissa da conveno sobre configurao, onde se voc segue o
padro, no necessrio dizer ao Maven que voc est fazendo isso. Um exemplo clssico disso a
estrutura de diretrios, se voc segue toda a estrutura de diretrios padro do Maven no seu projeto, no
vai precisar dizer ao plugin do compilador Javac onde ficam os seus arquivos de cdigo fonte nem pra
onde ele deve copiar os arquivos .class resultantes, ele j sabe exatamente onde procurar por tudo.
Ele foi desenvolvido originalmente pela equipe do projeto Jakarta Turbine com o objetivo de simplificar
os build files do Ant utilizados no projeto. Eles estavam procurando por uma maneira de deixar todos os
projetos seguindo uma mesma estrutura padronizada e tambm queriam no ter mais que enviar os
arquivos .jar das dependncias para os sistemas de controle de verso, foi ento que surgiu a primeira
verso da ferramenta, que em 2005 foi completamente reescrita, resultando no Maven 2, que foi
construdo sobre toda a experincia dos desenvolvedores e usurios da primeira verso.
Ento, mos a obra!

Antes de continuar a leitura Instalando o Maven 2 na sua Mquina


Voc deve ir at a rea de downloads
http://maven.apache.org/download.html

da

pgina

do

projeto

->

Procure a verso mais atual disponvel (este tutorial utilizou a verso 2.0.4) e baixe o
arquivo (os arquivos funcionam para qualquer sistema operacional), descompacte o
contedo do arquivo em um diretrio qualquer do seu computador e coloque a pasta
/bin do diretrio onde o arquivo foi descompactado no PATH do seu sistema
operacional.
Voc tambm deve ter a varivel de ambiente JAVA_HOME definida, com o valor do
diretrio onde foi instalado o JDK.
No Windows XP, basta ir no Painel de Controle, selecionar Desempenho e
Manuteno, depois Sistema, clique na aba Avanado, Variveis de Ambiente,
procure a varivel de ambiente com o nome PATH e no fim do valor atual adicione
um ; e o caminho para a pasta bin da instalao do Maven.
Com o servio feito, abra o console (a linha de comando do seu sistema operacional) e
digite mvn v, voc deve receber uma mensagem parecida com a seguinte:
GUJ http://www.guj.com.br Pgina 1

GUJ

http://www.guj.com.br

Maven version: 2.0.4

Iniciando o projeto
A primeira parte na criao de um projeto para o Maven a definio do seu arquivo de
configurao, o POM, nesse arquivo que ficam todas as informaes sobre o projeto que o Maven
utiliza para fazer a sua gerncia. Seguindo a estrutura de diretrios e arquivos padro, esse arquivo tem
que estar na pasta raiz do projeto e deve se chamar pom.xml, vejamos o nosso POM inicial:
Listagem 1 Primeira verso do pom.xml

<?xml version="1.0" encoding="UTF-8"?>


<project>
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.guj</groupId>
<artifactId>aprendendo-maven</artifactId>
<packaging>war</packaging>
<version>0.0.1</version>
<name>Aprendendo o Maven 2</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
O n raiz da configurao o <project/>, dentro dele ficam todas as informaes do projeto. O
primeiro n interno, <modelVersion/>, contm a verso do arquivo de configurao do Maven, que no
nosso caso, para o Maven 2, 4.0.0, esse n obrigatrio para que a ferramenta saiba qual a
estrutura do documento.
O n seguinte, <groupId/>, indica a qual grupo de projetos este projeto faz parte, uma maneira de
se organizar de maneira mais simples os vrios projetos dentro de uma mesma empresa ou grupo de
desenvolvedores. Se voc tem vrias aplicaes, cada uma com vrios mdulos diferentes, poderia
definir um <groupId/> diferente para cada aplicao. O n <artifactId/> caracteriza o projeto atual, ele
seria o mdulo dentro de cada aplicao no exemplo anterior. Voc poderia, por exemplo, ter um
<groupId/> com.bi.app com um <artifactId/> persistncia, outro web, outro swing e etc. A
importncia na definio dos nomes dos seus projetos vai ser abordada mais a frente na parte de
repositrios do Maven.
O n <packaging/> define o tipo de artefato que este projeto deve gerar, no nosso caso, definimos o
artefato como um war, que um arquivo de aplicao web, mas poderamos definir ele como um jar
comum ou qualquer outro artefato que o Maven venha a suportar. O n <version/> indica a verso na
qual este projeto se encontra, por padro, os desenvolvedores do Maven adotaram o versionamento das
aplicaes utilizando 3 nmeros separados por . (pontos), mas voc pode utilizar isso da forma que
achar apropriado. O n <name/> apenas um nome mais bonito para o projeto e vai ser utilizado na
hora de gerar os logs e na criao da documentao do projeto.
Estes so basicamente os ns que vo ser encontrados em qualquer POM, o ltimo n,
<dependencies/>, define uma dependncia do projeto e ns vamos entender mais a frente o que isso
quer dizer.

Estrutura de diretrios padro


Como j foi dito, o Maven tambm tem como objetivo padronizar as estruturas dos projetos para que
eles possam ser compreendidos mais facilmente, ento ele tem uma estrutura bsica de diretrios tida
como padro para os seus projetos, que a seguinte:

GUJ http://www.guj.com.br Pgina 2

GUJ

http://www.guj.com.br

pom.xml
src/
main/

test/

site/

-----------

java/
resources/
webapp/
java/
resources/

Arquivo de configurao do projeto


pasta raiz
tronco principal
cdigo fonte Java
recursos (arquivos de configurao, imagens, etc)
aplicao web Java
tronco de testes unitrios e de integrao
cdigo fonte dos testes do JUnit
recursos dos testes
tronco principal da documentao

Seguindo esta estrutura, no necessrio dizer a ferramenta onde ficam os seus arquivos, ele sabe
automaticamente onde procurar por eles. Um ponto importante desta estrutura que ela separa os
arquivos da aplicao dos arquivos dos testes da aplicao, assim, quando voc gerar um JAR ou
WAR do sistema, os seus testes no vo junto, porque no h necessidade de se empacotar testes
unitrios junto com o sistema.
Nas pastas java voc s deve colocar aquivos .java (arquivos de cdigo fonte), qualquer outro
tipo de arquivo vai ser ignorado pelo Maven e seus plugins, se voc precisa adicionar arquivos de
configurao no classpath da aplicao (dentro do JAR, como arquivos de configurao do Hibernate ou
Log4J) eles devem estar dento da pasta resources, pois nela que o Maven procura por arquivos de
configurao.
A pasta webapp que vista s necessria se o projeto em questo for de uma aplicao web,
seno ela no precisa ser colocada. A pasta webapp contm os arquivos de uma aplicao web Java,
como os JSPs, imagens, e as pastas WEB-INF e META-INF, como definido na estrutura de diretrios
das aplicaes web em Java. Os arquivos de configurao da aplicao web web.xml no so
colocados nas pastas resources e sim dentro de webapp/WEB-INF/web.xml. Lembre-se sempre que
s vo para as pastas resources os arquivos de configurao que precisam estar no classpath da
aplicao.
A ltima pasta definida a pasta site, que contm os arquivos de documentao que vo ser
utilizados para gerar um mini-site do projeto, com informaes extradas dom POM e de outros plugins
utilizados, como geradores de relatrios de anlise de cdigo.

Repositrios e dependncias
Na introduo ns falamos sobre repositrios e no nosso primeiro arquivo de configurao ns vimos o
n <dependencies/> que declara as dependncias do projeto, mas o que so as dependncias do
projeto?
As dependncias de um projeto para o Maven so os arquivos ou bibliotecas (arquivos JAR) que ele
precisa em alguma das fases do seu ciclo de vida. No nosso POM de exemplo, declaramos uma
dependncia no JAR do JUnit, para que pudssemos utilizar as classes do JUnit no projeto. Todas as
dependncias necessrias para o projeto devem ser definidas no POM, para que o Maven possa utilizlas nas fases do ciclo de vida do projeto que elas so necessrias.
Toda a execuo de aes do Maven depende de em qual parte do ciclo de vida o projeto est, em um
projeto, existem as fases de preparao, compilao, teste, empacotamento e instalao e as
dependncias esto intimamente ligadas a este ciclo de vida.
Uma dependncia definida no n <dependencies/> do POM, cada dependncia fica dentro de um n
<dependency/>, que tem os seguintes ns componentes (existem outros alm dos aqui definidos):

<groupId/> - O valor do groupId do POM da dependncia


<artifactId/> - O valor do artifactId do POM da dependncia
<version/> - O valor da version do POM da dependncia
<scope/> - O escopo do ciclo de vida do projeto no qual esta dependncia vai estar disponvel

Os ns so todos auto-explicativos, pois j os vimos no POM do projeto, entretanto, existe um n que


ainda no tnhamos visto, <scope/>, que define quando uma dependncia est ou no disponvel para o
projeto. Este n pode assumir os seguintes valores:
GUJ http://www.guj.com.br Pgina 3

GUJ

http://www.guj.com.br

compile A dependncia fica disponvel durante todas as fases do projeto, desde a


compilao at a instalao do sistema. Deve ser utilizada para dependncias que so
chamadas diretamente pelo cdigo. Este o escopo padro do Maven quando nenhum escopo
definido (o n <scope/> em uma dependncia opcional).
provided A dependncia est disponvel para compilao mas em tempo de execuo ela
deve ser disponibilizada pelo ambiente no qual a aplicao est executando. Um exemplo
deste escopo a API de Servlets, pois ns precisamos utilizar ela para compilar os nossos
sistemas Java para a Web, mas no necessrio empacotar a aplicao com ela para rodar em
um servidor web, o prprio servidor se encarrega de fornecer uma implementao.
runtime o contrrio de provided, a dependncia no est disponvel em tempo de
compilao mas enviada junto com o projeto em tempo de execuo, normalmente utizada
para bibliotecas que so carregadas dinamicamente (como drivers JDBC) e que no precisam
estar disponveis para que o sistema seja compilado.
test A dependncia s vai estar disponvel para a execuo dos testes do sistema e no vai
ser enviada junto com a aplicao. Deve ser utilizada para bibliotecas que so utilizadas
apenas para testar o sistema, como a biblioteca do JUnit no nosso exemplo, que s est
disponvel no escopo test.
system Indica que a dependncia no estar disponvel no repositrio do Maven e sua
localizao deve ser fornecida dentro do POM.

Escolha com cuidado o escopo no qual voc quer que a sua dependncia esteja, pois definir um escopo
errado tanto pode fazer com que o seu projeto contenha bibliotecas inteis (como adicionar bibliotecas de
teste ao ambiente de produo) como tambm podem fazer com que ele simplesmente no funcione
(como deixar uma dependncia que deveria ser runtime como provided).
A gerncia de dependncias uma das partes mais importantes do Maven e uma das partes mais
importantes desta funcionalidade a busca automtica de dependncias em repositrios na sua mquina
ou na internet.
Um repositrio para o Maven uma estrutura de diretrios e arquivos na qual ele armazena e busca
por todas as dependncias dos projetos que ele gerencia. Sempre que voc declara uma dependncia em
um projeto, o Maven sai em busca dessa dependncia no seu repositrio local (normalmente fica em
sua pasta de usurio/.m2/repository, no Windows XP seria algo como C:\\Documents and
Settings\seu_usurio\.m2\repository), se ele no encontrar nada no repositrio local, vai tentar buscar a
dependncia em um dos seus repositrios remotos (na internet) que vem configurados automaticamente
na ferramenta (voc tambm pode definir outros repositrios alm dos padro).
Um repositrio segue uma estrutura simples de pastas baseadas nas identificaes do prprio projeto,
atravs das informaes disponveis nos ns <groupId/>, <artifactId/> e <version/>. O Maven define a
estrutura de pastas da seguinte forma:

GUJ http://www.guj.com.br Pgina 4

GUJ

http://www.guj.com.br

Para declarar esta dependncia no nosso POM, ela seria definida da seguinte forma:
Listagem 2: Declarando a dependncia no Hibernate

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.1.3</version>
<scope>test</scope>
<type>jar</type>
</dependency>
A primeira parte da URL o caminho para o repositrio (que neste caso o repositrio remoto do
Ibiblio, mas poderia ser o seu repositrio local), a segunda parte o valor do <groupId/> onde a cada .
encontrado, uma nova pasta criada (org.hibernate torna-se /org/hibernate/), a terceira parte o
valor do <artifactId/> (se houverem pontos aqui eles vo ser inseridos no nome, no so criadas novas
pastas como no <groupId/>).
A ltima parte o prprio arquivo em si, que tambm tem o seu nome gerado com base nas
informaes do POM. Na declarao da dependncia do JUnit no nosso POM anterior, no havia a tag
<type/>, porque a definio dela opcional, quando voc no a define, o Maven assume
automaticamente que a dependncia um arquivo .JAR. O Maven tambm adiciona um - (hfen)
entre o <artifactId/> e a <version/> na hora de gerar o nome do arquivo.
A capacidade de gerenciar as dependncias de forma igual para todos os projetos uma das
caractersticas que o diferencia de outras ferramentas de build como o Ant, pois quando voc utiliza o
Ant, precisa definir e guardas as dependncias dentro do seu projeto ou apontar diretamente para elas
no seu sistema de arquivos, j com o Maven voc define todas as dependncias de uma nica maneira
(no POM) e a ferramenta se encarrega de fazer com que ela esteja disponvel na sua aplicao.
Outro fator que diferencia o Maven de outras ferramentas que ele tambm gerencia as
dependncias das dependncias do seu projeto. Frameworks como o Hibernate utilizam vrias outras
bibliotecas e em outras ferramentas seria necessrio definir todas estas dependncias direto na sua
configurao, com o Maven, ele utiliza a prpria descrio da dependncia (o seu POM) para descobrir
quais so as suas dependncias e as traz junto para o projeto, voc no precisa mais se preocupar em
saber todas as bibliotecas que precisam ser adicionadas ao classpath, o Maven adiciona todas elas
automaticamente.

Fazendo o primeiro build com o Maven


Agora que voc j conhece o bsico da configurao e como o Maven gerencia as dependncias e os
repositrios, podemos passar ao verdadeiro trabalho de gerenciar um projeto web. Voc pode utilizar os
arquivos que acompanham o tutorial ou utilizar uma aplicao web sua. Utilizando a aplicao de
exemplo do tutorial, abra o console (o aplicativo de linha de comando) e v at a pasta do projeto (a que
contm o arquivo pom.xml).
Chegando a esta pasta, digite (voc tem que estar conectado na internet para executar este
comando):
mvn compiler:compile
mvn o nome do executvel que chama o Maven no seu ambiente, no Windows um arquivo
.BAT, no Linux e MacOS um script shell, sempre que voc for executar qualquer comando no Maven,
deve chamar esse executvel. Se a primeira vez que voc executa o compilador do Maven ele vai
baixar algumas dependncias do seu repositrio na internet (por isto voc precisa estar conectado) e
aps baixar todas as dependncias, ele vai executar o comando compile do plugin compiler.
Todas as funcionalidades do Maven so fornecidas por plugins, que so conjuntos de cdigo que
executam aes sobre um projeto. Normalmente, cada plugin faz um trabalho especfico ou vrios
trabalhos relacionados a uma caracterstica especfica de um projeto. O plugin que ns acabamos de
executar o plugin compilador do Maven, que pega todos os arquivos de cdigo fonte disponibilizados
em src/main/java, compila e os envia pra pasta target/classes dentro da pasta do projeto. O Maven
cria automaticamente uma pasta chamada target no diretrio do projeto para colocar todos os artefatos
que ele gera.
GUJ http://www.guj.com.br Pgina 5

GUJ

http://www.guj.com.br

Os plugins que so utilizados em um projeto tambm precisam ser declarados no POM, vejamos ento
como declarar um plugin no Maven:
Listagem 3 POM com o plugin compilador definido

<?xml version="1.0" encoding="UTF-8"?>


<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.maujr</groupId>
<artifactId>aprendendo-maven2</artifactId>
<packaging>war</packaging>
<version>1.0.0</version>
<inceptionYear>2006</inceptionYear>
<name>Aprendendo o Maven 2</name>
<description>
Aprendendo a utilizar o Maven 2 em projetos Java
</description>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Os plugins utilizados em um projeto so declarados dentro do n <plugins/> que fica no n <build/>.
O n <build/> contm informaes gerais sobre o processo de build do projeto, nele que ns
poderamos definir uma estrutura de diretrios diferente do padro do Maven, mas isso no vai ser
abordado neste material.
Para definir um plugin, ns criamos um n <plugin/> dentro do n <plugins/> e nele definimos as
informaes especficas do plugin, <groupId/>, <artifactId/>, <version/> e <configuration/>. O
funcionamento destes ns idntico que j visto anteriormente, apenas <configuration/> ainda no foi
visto, porque ele especfico da declarao do plugin. neste n que so definidas as propriedades e
configuraes para a execuo do plugin. Cada plugin tem o eu prprio conjunto de variveis de
configurao (voc pode ver a lista de variveis disponveis na documentao do prprio plugin).
No nosso exemplo, ns redefinimos duas variveis de configurao do plugin, <source/> e <target/>,
para indicar que ns desejamos que o compilador gere classes que utilizam e que so compatveis apenas
do Java 1.5 em diante. Para saber todas as variveis do plugin compiler, basta ir ao seu site:
http://maven.apache.org/plugins/maven-compiler-plugin
Existem plugins para a automatizao de vrias tarefas dentro do Maven, voc pode encontrar a lista
oficial no prprio site da ferramenta: http://maven.apache.org/plugins/index.html
Alm deste site, existem vrias outras comunidades que desenvolvem plugins para o Maven, basta
dar uma boa procurada na internet que a sua necessidade provavelmente j foi resolvida por alguma
outra pessoa.

GUJ http://www.guj.com.br Pgina 6

GUJ

http://www.guj.com.br

Desenvolvendo um projeto web com o Maven 2


Normalmente, para desenvolver um projeto web em Java, voc precisa instalar um servidor web,
configurar ele junto ao seu ambiente de desenvolvimento e comear a trabalhar com ele no seu projeto.
A integrao entre as ferramentas no costuma ser simples e a maioria dos servidores web disponveis
so pesados e difceis de serem configurados. Com vistas sobre estes problemas, os desenvolvedores do
levssimo servidor web Java Jetty desenvolveram um plugin para o Maven onde de dentro da prpria
ferramenta e com um mnimo de configurao voc pode ter um servidor web rodando para fazer todos
os testes da sua aplicao.
Para utilizar o plugin do Jetty no seu projeto, basta apenas adicion-lo ao seu projeto, da mesma
forma que o plugin compilador foi adicionado anteriormente, vejamos como o POM deve ficar:
Listagem 4 POM com o Jetty 6 configurado

<?xml version="1.0" encoding="UTF-8"?>


<project>
mesmo contedo do anterior
<build>
<plugins>
mesmo contedo do anterior, s muda daqui pra frente
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.0.1</version>
<configuration>
<contextPath>/</contextPath>
<connectors>
<connector
implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>80</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
</connectors>
</configuration>
</plugin>
</plugins>
</build>
</project>
Como voc pode ver, a declarao do plugin idntica a anterior, mudando apenas as configuraes
especficas do plugin, vejamos o que cada n significa:

<contextPath/> - contexto web pelo qual a aplicao vai ser acessada, declarando o valor
como / significa que a aplicao fica na raiz do servidor.
<connectors/> - so os responsveis por gerenciar as conexes do navegador, cada
<connector/> pode ser de um tipo e escutar por requisies em uma porta diferente, a
implementao mais comum o SelectChannelConnector, pois ele o mais rpido de todos.
o <port/> - a porta na qual o servidor deve esperar por conexes, a porta 80 a
porta padro do http

Com essa configurao, j podemos executar a nossa aplicao web no servidor, vamos primeiro
executar o comando para chamar o servidor (se a primeira vez que voc faz isso, deve estar conectado
na internet):
mvn jetty:run
Com esse comando, ns mandamos o Maven inicializar o servidor web dentro do nosso projeto.
Quando aparecer na linha de comando a mensagem Started Jetty Server, o servidor j pode comear a
receber requisies. Com base nas configuraes que ns fizemos, a aplicao de exemplo vai estar
disponvel no endereo http://localhost/.
Seguindo a idia de padronizao das estruturas de diretrio, as aplicaes web gerenciadas pelo
Maven 2 devem colocar os seus arquivos especficos da web dentro da pasta src/main/webapp, nesta
GUJ http://www.guj.com.br Pgina 7

GUJ

http://www.guj.com.br

pasta que voc vai montar a sua estrutura de diretrios de aplicao web em Java (com o diretrio raiz,
as pastas WEB-INF e META-INF). Mais uma vez, seguindo o padro, no necessrio fazer nenhuma
configurao para que os plugins entendam a sua estrutura como a estrutura de uma aplicao web.
Para parar o servidor, basta executar o comando que para a execuo das aplicaes na linha de
comando, no Windows o comando CTRL+C. Sempre que voc atualizar as classes ou os arquivos de
configurao da aplicao, o servidor precisa ser parado e inicializado outra vez, se voc quer que ele
descubra automaticamente que houveram mudanas, adicione o n <scanIntervalSeconds/> a
configurao do plugin com o valor em segundos que a freqncia com a qual ele vai procurar
atualizaes na aplicao e se reiniciar sozinho. Por exemplo, se voc define esta propriedade como 10
ele vai varrer toda a aplicao a cada 10 segundos procurando por atualizaes, se elas forem
encontradas, ele vai se reiniciar automaticamente.
Agora, alm de uma ferramenta de gerncia de projetos, voc tem um servidor web leve e rpido para
desenvolver as suas aplicaes sem ter que ficar se preocupando em instalao, variveis de ambiente e
todas essas coisas, s mandar o Maven executar o plugin e mos a obra!

Fazendo a implantao (deployment) do sistema


Vimos como fazer a nossa aplicao web ser executada no servidor web do prprio Maven, mas ns
normalmente enviamos a aplicao para ser implantada em um servidor de produo, tanto em formato
WAR quanto na estrutura de diretrios padro de aplicaes web em Java.
Para gerar um WAR da aplicao, voc s precisa digitar o seguinte comando no console na pasta raiz
do projeto (a que contm o pom.xml):

mvn package
Se voc verificar a pasta target do seu projeto, dentro dela vai haver uma pasta com o nome
aprendendo-maven2-1.0.0, que contm a estrutura completa da aplicao web, com os arquivos
compilados, as dependncias em bibliotecas na pasta WEB-INF/lib (o Maven copia automaticamente
para c qualquer dependncia de escopo runtime, compile ou system). Alm desta pasta, voc
tambm vai encontrar o arquivo aprendendo-maven2-1.0.0.war, que o WAR gerado por este
projeto, nele tambm so encontrados todos os arquivos que estavam dentro da pasta webapp do
projeto do Maven, as classes e arquivos de configurao e todas as bibliotecas. O arquivo gerado est
pronto para ser implantado em qualquer servidor web Java que suporte a especificao de servlets.
Como o n <packaging/> do projeto foi definido com o valor war, o Maven sabe que na fase
package do ciclo de vida do projeto ele deve ser empacotado como um arquivo war. O ciclo de um
projeto no Maven definido normalmente atravs das seguintes fases (na verdade, a seqncia um
pouco maior, veja as referncias do tutorial para encontrar a lista completa):

validate valida se o projeto vlido (se a sua configurao est correta) e se o ambiente est
corretamente configurado (com as devidas variveis de ambiente configuradas)
compile compila o cdigo fonte do projeto
test executa os testes unitrios do projeto
package empacota o projeto conforme foi definido na sua descrio
integration-test executa os testes de integrao (os que so feitos com a aplicao
empacotada e implantada em um container)
verify verifica a qualidade da aplicao e do cdigo (normalmente com relatrios de anlize de
cdigo, resultados de testes de integrao e carga)
install instala o artefato gerado no repositrio local do Maven
deploy envia o artefato gerado para um servidor remoto para que ela seja implantada

Quando voc manda o Maven executar qualquer uma destas fases, ele automaticamente executa
todas as fases anteriores, no nosso caso, como mandamos o Maven executar a fase package ele
automaticamente executou as fases validate, compile e test antes de finalmente executar
package. Alguns plugins se associam automaticamente a fases de um projeto, para que eles sejam
executados sem que o usurio precise indicar o seu uso, um caso comum o plugin compiler (o
compilador Javac) que registrado para executar sempre na fase compile de um projeto, para
compilar os seus arquivos de cdigo fonte.

GUJ http://www.guj.com.br Pgina 8

GUJ

http://www.guj.com.br

Olhando a lista de plugins do Maven, voc encontra um plugin chamado de war, este o plugin
responsvel pelo empacotamento de suas classes na estrutura de uma aplicao web. Voc poderia
chamar o plugin diretamente, em vez de indicar a fase package, s que o plugin war no executa
todos os passos at a sua chamada (que seriam compilar os arquivos de cdigo fonte e copiar os
arquivos de configurao que esto em src/main/resources), voc tem que chamar todos os plugins
explicitamente, vejamos como fazer isso:
mvn resources:resources compiler:compile war:war
Neste comando, ns enviamos ao Maven uma instruo para que ele execute, sequencialmente, trs
plugins. Primeiro ele executa o plugin resources com a ao resources, que copia todos os arquivos
que esto em src/main/resources para a pasta target/classes, depois ele executa o plugin compiler
com a ao compile, que faz com que ele compile todos os arquivos .java disponveis em
src/main/java e copie os arquivos resultantes para target/classes. Por ltimo, ele executa o plugin
war com a ao war que vai criar um arquivo war com o contedo da pasta src/main/webapp,
adicionando as dependncias na pasta WEB-INF/lib do arquivo e copiando os arquivos que esto em
target/classes para dentro da pasta WEB-INF/classes.
claro que muito mais simples e cmodo simplesmente digitar mvn package e deixar o Maven
cuidar de todo o resto, mas sempre existem casos especficos que necessitam de um controle mais fino
do que est acontecendo no build do projeto.

Relatrios e informaes sobre o projeto


Agora que voc j entende das dependncias, sabe compilar os projetos, sabe executar um servidor
web embutido e j entende como funcionam os plugins do Maven, parece que no precisa de mais nada.
Mas agora ns vamos ver mais uma caracterstica do Maven que o diferencia de outras ferramentas mais
simples, a capacidade de gerar informaes a partir do seu cdigo fonte e do POM.
As informaes podem ser geradas de vrias formas diferentes, elas podem, inclusive, ser contedo
esttico que voc gostaria de incluir na documentao do projeto (como um guia para o usurio), mas
em sua maior parte a documentao gerada pelo Maven est intimamente relacionada a obteno de
informaes sobre o estado de sade do projeto, com anlises de qualidade de cdigo, conformidade
com padres de codificao e outros.
Para lidar com isso, o Maven tem um conjunto de plugins de relatrio que analisam o projeto
(normalmente o cdigo fonte do projeto) e geram relatrios com base nestas informaes. Os relatrios
podem ser a simples gerao de um javadoc e os fontes identados em arquivos HTML referenciveis,
como anlises complexas de busca de padres de bugs comuns em cdigo ou cobertura dos testes
unitrios.
Vejamos o exemplo de um POM com relatrios configurados:
Listagem 5 POM do projeto com relatrios

<?xml version="1.0" encoding="UTF-8"?>


<project>
.....informaes gerais do projeto
<build>
.....configurao dos plugins do build
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
GUJ http://www.guj.com.br Pgina 9

GUJ

http://www.guj.com.br

<artifactId>maven-checkstyle-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
</plugin>
</plugins>
</reporting>
</project>
Os relatrios so definidos no n em um n <plugins/> dentro do n <reporting/>. Cada relatrio
funciona como um plugin comum do Maven e podem ser configurados da mesma forma que os outros
plugins so, a nica diferena que eles so executados quando gerada a documentao do projeto, a
atravs do plugin site. Para gerar a documentao do projeto, voc s precisa enviar o seguinte
comando:
mvn site
O Maven vai automaticamente gerar toda a documentao possvel sobre o projeto (com base no
POM) e executar todos os plugins de relatrios definidos. O site do projeto vai estar disponvel dentro da
pasta target/site do seu projeto, basta abrir o arquivo index.html ver o resultado gerado pelo Maven.
No nosso exemplo, ele vai executar o plugin javadoc, que gera como relatrio o Javadoc de todos os
arquivos fontes do sistema, o plugin jxr, que gera como relatrio todo o cdigo fonte do sistema em
formatado em HTML, o plugin checkstyle que gera uma anlise do cdigo quanto a tua aderncia a um
padro de desenvolvimento especfico (quando nenhum padro definido, ele toma como base as regras
do Java) e o PMD, que analiza o cdigo em busca de bugs e outros problemas comuns.
De posse destas informaes, um gerente de projetos vai ter muito mais facilidade ao montar uma
anlise completa do estado atual e at mesmo reforar algum critrio ou padro de desenvolvimento,
com base nas ferramentas de relatrio definidas. Alm destes, existem vrios outros plugins de relatrio
que geram informaes sobre o projeto automaticamente tambm podem ser grande valia tanto para os
gerentes quanto para os prprios desenvolvedores, pois eles estaro garantindo a qualidade do cdigo e
do sistema que est sendo entregue.

Dicas para problemas comuns do Maven


No encontro a dependncia em nenhum dos repositrios remoto!
As vezes o seu projeto depende de uma biblioteca ou framework que no est disponvel em nenhm
dos repositrios do Maven, as vezes porque ela no open-source, outras vezes porque ningum
colocou ela em nenhum repositrio. Um caso comum a biblioteca de interfaces grficas para Java
Thinlet, que realmente ainda no est disponvel em nenhum dos repositrios remotos.
Para adicionar ela em nosso projeto, temos que fazer com que ela esteja disponvel no repositrio local
da mquina que est sendo utilizada. Para fazer isso, precisamos do JAR da biblioteca e de criar um
POM com a sua declarao. Vejamos como ficaria o nosso POM:
Listagem 6 POM da biblioteca do Thinlet

<?xml version="1.0" encoding="UTF-8"?>


<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.thinlet</groupId>
<artifactId>thinlet</artifactId>
<version>1.0.0</version>
</project>
Como voc pode ver, esse POM mnimo, contando apenas com as informaes obrigatrias do
projeto. A partir desta definio, ns j sabemos que o caminho para a biblioteca no repositrio deve ser:
caminho para o repositrio do Maven/com/thinlet/thinlet/1.0.0/thinlet-1.0.0.jar

GUJ http://www.guj.com.br Pgina 10

GUJ

http://www.guj.com.br

Ento, ns s precisamos renomear o JAR do Thinlet para thinlet-1.0.0.jar, copi-lo para a pasta
com/thinlet/thinlet/1.0.0/ e colocar nesta mesma pasta o POM da Listagem 6 com o mesmo nome do
arquivo JAR, mudando apenas a extenso para .pom, ele ficaria como thinlet-1.0.0.pom. O POM deve
ter o mesmo nome do artefato porque a partir do nome do artefato que o Maven sabe o nome do seu
arquivo de configurao e baixa as suas dependncias.
A maioria dos arquivos JAR que fazem parte do Java (como o JavaMail, o Activation, o Connector) no
esto disponveis nos repositrios do Maven, ento voc provavelmente vai ter que adicion-los
manualmente desta forma ao seu repositrio local. Preste sempre ateno aos erros indicados pelo
Maven, quando ele indicar uma dependncia que no pode ser encontrada, provavelmente o caso de
adio manual no seu repositrio.
Eu quero configurar o lugar do repositrio local na minha mquina!
O Maven no exige que voc faa esta configurao, mas voc pode querer escolher aonde ele vai
copiar os arquivos, tanto por causa de espao ou porque voc pode deixar o repositrio local como
sendo um disco compartilhado em uma rede (Windows ou Linux, contanto que ele esteja no sistema de
arquivos). O maven pode ser configurado em trs nveis:

Projeto Voc pode manter a configurao especfica para o projeto, diretamente no POM
Usurio Voc pode criar uma configurao especfica para o usurio atual, isso feito
definindo um arquivo settings.xml na pasta .m2 que criada na sua pasta de usurio do
sistema operacional (no Windows XP ela fica em C:\Documents And Settings\seu-login-nowindows)
Aplicao a configurao definida diretamente na instalao do Maven, o arquivo
settings.xml fica dentro da pasta conf da sua instalao do Maven.

No nosso exemplo, ns vamos definir uma configurao para a aplicao como um todo, escrevendo
no arquivo settings.xml que fica dentro da pasta conf da instalao do Maven. Vejamos como poderia
ser feita esta configurao:
Listagem 7 Exemplo de arquivo settings.xml

<settings>
<localRepository>\\Maven\maven-repository\</localRepository>
<mirrors>
<mirror>
<id>ggi-project.org</id>
<url>http://ftp.ggi-project.org/pub/packages/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>base-profile</id>
<repositories>
<repository>
<id>local-repo</id>
<name>Repositorio da minha empresa</name>
<url>http://www.minhaempresa.org/maven2/</url>
<layout>default</layout>
<snapshotPolicy>always</snapshotPolicy>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>baseProfile</activeProfile>
</activeProfiles>
</settings>
O n que define a localizao do repositrio o <localRepository/>, nele ns indicamos o local no
sistema de arquivos onde o repositrio encontrado. No nosso caso, indicamos uma pasta de rede

GUJ http://www.guj.com.br Pgina 11

GUJ

http://www.guj.com.br

compartilhada no Windows, assim todos os desenvolvedores que tem acesso a esta pasta podem usar o
mesmo repositrio local, sem ter que ficar replicando os mesmos arquivos em todas as mquinas.
Aps a definio do repositrio local, definimos um mirror para o repositrio central do Maven,
voc pode definir quantos mirrors desejar neste arquivo e eles sero selecionados conforme a seqncia
na qual foram declarados. Isto interessante se voc tiver um mirror do repositrio que seja
geograficamente mais prximo de voc, pois isso pode aumentar a velocidade da transmisso dos dados.
Aps a definio dos mirrors ns temos a definio de profiles, que so conjuntos de configuraes
organizados em grupos, para facilitar o seu gerenciamento. Em um profile voc pode definir
configuraes como a verso do JDK que deve ser utilizado, repositrios remotos e outras coisas. Depois
de definir os profiles, voc tem que definir qual o profile que est ativo no momento, isto feito no
n <activeProfiles/>, que pode conter vrios <activeProfile/>, cada um com o id de um profile diferente.
Se voc deseja montar um repositrio remoto dentro de sua empresa, pode usar um profile e definir
este repositrio remoto dentro do profile (como no POM de exemplo), assim vai poder deixar todas as
bibliotecas que desejar no repositrio para que outras pessoas possam acessar (dentro ou fora da
empresa, dependendo da sua necessidade). Quando voc declara um novo repositrio remoto ele
adicionado a lista de repositrios do Maven, ento, todos os outros repositrios declarados ainda sero
chamados caso aja necessidade.

Integrando o Maven 2 com o Eclipse


O Maven 2 tem plugins para integrao com o NetBeans 5 e o Eclipse 3.1, aqui ns vamos ver como
funciona o plugin para integrao com o Eclipse. Antes de continuar, voc deve ter o Maven 2 e o Eclipse
3.1 devidamente instalado na sua mquina.
Para instalar o plugin no Eclipse, siga os seguintes passos:
1.
2.
3.
4.
5.
6.
7.

Selecione o menu Help


Selecione a opo Software Updates
Selecione a opo Find and Install
Na tela que aparece, escolha a opo Search for New Features do Install e clique no boto
Next
Na tela que aperece, clique no boto New Remote Site, digite o nome Maven 2 Plugin no
campo Name e a URL http://m2eclipse.codehaus.org/ no campo URL. Clique no boto
OK.
Veja se o quadro ao lado do nome Maven 2 Eclipse na lista est marcado, se no estiver,
marque-o.
Clique no boto Finish.

Deve aparecer uma tela pedindo a voc confirmao sobre a instalao do plugin, confirme a
instalao e o Eclipse vai comear a baixar os arquivos necessrios automaticamente. Quando ele
terminar, vai pedir pra reiniciar, deixe ele reiniciar e agora voc j tem o plugin do Maven 2 instalado no
seu Eclipse.
O plugin permite executar o Maven 2 de dentro do Eclipse e adiciona automaticamente qualquer
dependncia do POM no classpath do projeto do Eclipse. Para transformar um projeto comum em um
projeto gerenciado pelo Maven, basta clicar com o boto direito do mouse na pasta do projeto, procurar a
opo Maven 2 e clicar na opo Enable. Se o projeto j tiver um pom.xml o Maven simplesmente
usa este POM como configurao para o projeto, se ainda no existe um POM, ele vai mostrar um
formulrio para que voc possa indicar as informaes iniciais do projeto.
O plugin tambm permite que voc adicione dependncias sem ter que alterar diretamente o arquivo
de configurao. Basta clicar com o boto direito do mouse na pasta do projeto, ir na opo Maven e
selecionar a opo Add Dependency, um formulrio onde voc pode digitar o nome da dependncia vai
aparecer e voc vai poder fazer uma busca por ela nos repositrios configurados no seu Maven. A parte
de busca do plugin ainda tem alguns problemas, ento mesmo que voc no encontre a dependncia, ela
pode estar disponvel no plugin, mas provavelmente no pode ser indexada por algum motivo, ento em
alguns momentos ainda pode ser necessrio alterar diretamente o POM para adicionar uma dependncia
ao seu projeto.

GUJ http://www.guj.com.br Pgina 12

GUJ

http://www.guj.com.br

Adicionar o plugin do Maven ao seu Eclipse vai facilitar ainda mais a gerncia do seu classpath, pois
no vai mais ser preciso ficar colocando todos os JAR que ele depende dentro do prprio projeto, pois o
classpath vai ser gerenciado pelo Maven e a configurao do POM do projeto.

Referncias
Sites
Pgina oficial do Maven: http://maven.apache.org/
Ciclo de vida dos projetos do Maven:
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
Pgina oficial do Jetty: http://jetty.mortbay.org/
Lista de plugins do Maven 2: http://maven.apache.org/plugins/index.html
Pgina oficial do PMD: http://pmd.sourceforge.net/
Pgina oficial do Checkstyle: http://checkstyle.sourceforge.net/
Plugin do Maven 2 para o Eclipse: http://m2eclipse.codehaus.org/
Pgina do Eclipse: http://www.eclipse.org/
Livros
Maven: A Developers Notebook. Massol, Vincent. Editora OReilly, 2005.
Better Builds with Maven. Casey, John; Massol, Vincent; Porter, Brett; Sanches,
Carlos; Van Zyl, Jason. Mergere Library Press, 2006.

Concluso
Como voc j percebeu, o Maven uma poderosa ferramenta tanto na automatizao dos projetos
como tambm na gerncia de qualidade e visibilidade dos projetos. A partir da definio de um padro de
desenvolvimento, com estruturas comuns para todos os projetos, o Maven diminui os problemas
relacionados a o acesso de novos desenvolvedores a projetos que j estejam caminhando.
Os seus vrios plugins e integrao com ferramentas como o Eclipse e o NetBeans fazem do Maven
uma ferramenta ainda mais incrvel e indispensvel pra os desenvolvedores Java atualmente, pois no
necessrio deixar de lado o que j foi aprendido nem os investimentos feitos nestas ferramentas. O
Maven tem como objetivo principal padronizar e integrar o ambiente de desenvolvimento para que os
desenvolvedores se preocupem com o desenvolvimento dos sistemas, no na criao de uma infraestrutura que os permita automatizar os processos de desenvolvimento.
O Maven j prov toda a infra estrutura necessria para o desenvolvimento, livrando os
desenvolvedores e os gerentes das dores de cabea comuns na criao e padronizao de processos de
build em sistemas.

Sobre o autor
Maurcio Linhares de Arago Junior (mauricio.linhares@gmail.com http://maujr.org/ ) graduando em
Desenvolvimento de Software para Internet no CEFET-PB e Comunicao Social (habilitao Jornalismo) na UFPB.
membro da administrao do Grupo de Usurios Java da Paraba, moderador dos fruns do Grupo de Usurios Java,
instrutor e consultor independente e desenvolvedor da Phoebus Tecnologia ( http://www.phoebus.com.br/ ).

GUJ http://www.guj.com.br Pgina 13

Você também pode gostar