You are on page 1of 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

You might also like