You are on page 1of 4

Processo de build com o Maven

O Maven uma ferramenta de gerenciamento, construo e implantao de projetos muito interessante, que te ajuda no processo de gerenciamento de dependncias e no de build, gerao de relatrios e de documentao. Na Caelum esta a ferramenta usada em todos os projetos internos e nas consultorias. Muitas pessoas migram seus projetos para o Maven, mas acabam arrumando mais problemas que solues, pois no conseguem configur-lo corretamente, e acabam desistindo e fazendo tudo na mo, ou voltando para o Ant. Mas se voc conseguir ajustar as configuraes, o Maven vai te ajudar muito e vai compensar todos os (poucos) problemas que ele eventualmente causa. No incio do uso do Maven, espere formar com ele uma relao de amor e dio. Para comear a usar o Maven, tudo o que voc precisa fazer baix-lo e configurar umas poucas variveis de ambiente. Depois de ter feito isso, s digitar mvn [target] na linha de comando. Alguns sistemas operacionais j te oferecem essa instalao atravs do macport ou apt-get. A unidade bsica de configurao do Maven um arquivo chamado pom.xml, que deve ficar na raiz do seu projeto. Ele um arquivo conhecido como Project Object Model: l voc declara a estrutura, dependncias e caractersticas do seu projeto. A idia bem parecida com o build.xml do Ant: voc deixa o pom.xml na raiz do seu projeto para poder chamar as targets de build do seu projeto. O menor arquivo pom.xml vlido o seguinte: <project> <modelVersion>4.0.0</modelVersion> <groupId>br.com.caelum</groupId> <artifactId>teste</artifactId> <version>1.0</version> </project> Que contm apenas a identificao do projeto, e uma informao a mais: modelVersion, que a identificao da verso do arquivo pom.xml e deve ser sempre 4.0.0. A identificao do projeto consiste em trs informaes:

groupId: um identificador da empresa/grupo ao qual o projeto pertence. Geralmente o nome do site da empresa/grupo ao
contrrio. Ex: br.com.caelum.

artifactId: o nome do projeto. Ex: teste. version: a verso atual do projeto. Ex: 1.0-SNAPSHOT.
Essas informaes so usadas em muitos lugares, ccomo o controle de dependncias que , na minha opinio, a funcionalidade mais til do Maven. Por exemplo, para dizer que o log4j 1.2.15 uma dependncia da sua aplicao s acrescentar no seu pom as linhas: <project> ... <dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.15</version> </dependency> </dependencies> ... </project> Quando necessrio, o Maven vai baixar pra voc o jar do log4j 1.2.15, e todas as suas dependncias, e vai coloc-las no classpath da sua aplicao durante os builds, testes, etc. Ou seja, voc no precisa mais entrar no site do log4j, baixar um zip com vrios jars e ter que procurar quais jars devem ser colocados no classpath! No Repositrio de Bibliotecas do Maven voc encontra os jars que voc pode colocar como dependncia do seu projeto, e o pedao de xml que voc deve copiar e colar dentro da tag

dependencies do seu pom para incluir essas bibliotecas. Todos os jars baixados pelo Maven so guardados na pasta repository dentro da M2_HOME que voc configurou quando instalou o Maven. Assim, se mais de um projeto seu depende do mesmo jar, ele no baixado de novo. A grande diferena entre o build.xml do Ant e o pom.xml do Maven o paradigma. No Ant usamos esse XML praticamente como uma linguagem de programao, onde voc da comandos em relao ao build do projeto. No Maven usamos o XML para definir a estrutura do projeto, e a partir dessas declaraes o Maven possui targets bem definidos que usam essas informaes para saber como realizar aquela tarefa. Um exemplo: para compilar com o Ant criamos um target que chama o javac, mas para compilar com o Maven usamos um target j existente (no o criamos), e ele vai usar a informao que define onde est o cdigo fonte e para onde ele deve ser compilado (sendo que muitas dessas informaes possuem convenes e defaults, e nem precisam ser configuradas). Alm dos principais targets do Maven, voc pode executar targets de plugins. Voc s precisa digitar na linha de comando: mvn [nomedoplugin]:[target] e ento o Maven baixa o plugin, se necessrio, e executa a target pra voc. Existe uma lista bem grande de plugins do Maven e uma boa parte desses plugins podem ser usados sem nenhuma configurao adicional no seu pom. Para dar um exemplo de plugin do Maven nada melhor do que o plugin que cria um prottipo de projeto do Maven: o Archetype. bem parecido com o scaffold do Ruby: ele cria um prottipo de projeto a partir de um modelo escolhido. O jeito mais fcil de usar esse plugin digitando na linha de comando: mvn archetype:create E ento o Archetype vai perguntar qual o tipo de projeto que voc deseja, o groupID, artifactID, version e o pacote referentes ao seu projeto. Depois disso voc ter uma estrutura de projeto pronta para ser usada. Por exemplo se voc escolheu o tipo de projeto maven-archetype-quickstart, o Archetype vai criar uma estrutura de pastas parecidas com a seguinte: teste |-- pom.xml `-- src |-- main | `-- java | `-- br | `-- com | `-- caelum | `-- teste | `-- App.java `-- test `-- java `-- br `-- com `-- caelum `-- teste `-- AppTest.java E ento s continuar o seu projeto a partir da. O cdigo de teste j vem separado do cdigo principal, e o junit j vem como dependncia da aplicao. Voc tambm pode criar as pastassrc/main/resources e src/test/resources para colocar os recursos (arquivos de configurao, de teste, e etc) do cdigo principal e do de testes, respectivamente. Tudo que estiver dentro dessas pastas copiado diretamente para o diretrio onde as classes so compiladas, sem que seja necessrio fazer nenhuma configurao adicional. Se voc, por algum motivo, no gostou da estrutura que o Maven criou, ou est querendo migrar um projeto para o Maven que no segue essa estrutura, voc pode configurar os diretrios do projeto acrescentando algumas linhas no pom: <project> ... <build> <sourceDirectory> ${project.basedir}/src/java/main </sourceDirectory>

<testSourceDirectory> ${project.basedir}/src/java/test </testSourceDirectory> <resources> <resource> <directory> ${project.basedir}/src/resources/main </directory> </resource> </resources> <testResources> <testResource> <directory> ${project.basedir}/src/resources/test </directory> </testResource> </testResources> </build>

... </project> Nesse exemplo o diretrio principal de cdigo e de recursos estaro em src/java/main e src/resources/main respectivamente, e os diretorios de teste em src/java/test esrc/resources/test. Agora com um projeto Maven j preparado, vamos para a principal funcionalidade: o build. O build do Maven baseado no conceito de ciclo de vida: o processo de construo e distribuio da sua aplicao dividido em partes bem definidas chamadas fases, seguindo um ciclo. O ciclo padro o seguinte:

compile compila o cdigo fonte do projeto test executa os testes unitrios do cdigo compilado, usando uma ferramenta de testes unitrios, como o junit. package empacota o cdigo compilado de acordo com o empacotamento escolhido, por exemplo, em JAR. integration-test processa e faz o deploy do pacote em um ambiente onde os testes de integrao podem ser rodados. install instala o pacote no repositrio local, para ser usado como dependncia de outros projetos locais deploy feito em ambiente de integrao ou de release, copia o pacote final para um repositrio remoto para ser compartilhado
entre desenvolvedores e projetos Voc pode invocar qualquer dessas fases na linha de comando, digitando: mvn [fase] Por exemplo se voc digitar mvn package o Maven vai executar todas as fases anteriores do ciclo at a fase package. Uma lista completa das fases do ciclo de vida possveis pode ser encontrada aqui. Algumas das fases do ciclo possuem plugins associadas a elas, e esses plugins so executados assim que a fase chamada para ser executada. Voc pode tambm registrar plugins para rodarem em qualquer fase do ciclo, conseguindo, assim, personalizar o build do seu projeto facilmente. Por exemplo, se voc quiser criar um jar com o cdigo fonte do projeto, e que esse jar seja gerado depois que o projeto foi empacotado, s acrescentar no seu pom: <project> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <executions> <execution> <id>attach-sources</id> <phase>package</phase> <goals> <goal>jar</goal> </goals> </execution>

</executions> </plugin> </plugins> </build> ... </project> Assim, o plugin Source vai executar seu goal jar na fase package do ciclo de vida. como se fosse chamado mvn source:jar quando o build passa pela fase de package. A fase package j possui um plugin associado a ela: o jar:jar (supondo que um projeto jar), ento o plugin source s ser executado depois do jar:jar. Em geral se voc registrar mais de um plugin pra mesma fase, eles sero executados na ordem em que eles forem declarados. O jeito de configurar o plugin para coloc-lo dentro de uma fase do ciclo geralmente est no site principal do plugin, na seo Usage. O Maven possui ainda outras funcionalidades interessantes, como gerao de relatrios. Alguns plugins tambm merecem uma ateno especial, como o Eclipse que gera informaes de projeto para o eclipse (.classpath e .project), o Antrun que te permite executar cdigo Ant dentro do Maven, o Coberturaque gera um relatrio mostrando a cobertura de testes no seu projeto, o Jetty que sobe uma instncia do Jetty com sua aplicao deployed, o Selenium que sobe uma instncia do servidor do Selenium para poder fazer os testes de aceitao do selenium, enfim, existem vrios plugins interessantes e relativamente fcil achar o plugin que faz o que voc precisa. igualmente fcil, tambm, fazer um plugin para o Maven, o chamado Mojo.

You might also like