Blog do Urubatan
msgbartop
Desenvolvedor, Arquiteto, Palestrante, Coordenador do RSJUG, Patinador e Blogger
msgbarbottom

15 Sep 06 To Maven or not To Maven 2.0

A algum tempo atraz eu escrevi este post, falando sobre o Maven 2.0.
Pois é, depois daquilo tropecei no mesmo problema que um monte de gente tropeça para usar o maven, ou seja, tenho projetos que por um motivo ou outro não quero ou não posso usar a estrutura de diretórios do maven …
Perguntei para um monte de gente (tah, podem ter sido só uns 5 ou 6) e todos disseram que quando usavam o maven usavam a estrutura de diretórios dele mesmo, então passei bastante tempo sem nem pensar em usar o tal do Maven 2.
Bom, voltando ao assunto, esta semana eu resolvi “perder” mais algumas horas estudando o tal do maven, o resultado foi que consegui utilizar todo o poder do Maven 2, em um projeto web com a estrutura padrão do eclipse.
E como eu fiz isto?

Bom, foi só olhar a documentação dos plugins do maven :D Pois é, da outra vez perdi uns 3 dias e não li a porcaria do manual :( Sim, culpa minha, mas segue um exemplinho de como utilizar o maven em um projeto do Web Tools …

primeiro, configuramos um POM simples:

<project xmlns=”http://maven.apache.org/POM/4.0.0″
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd”>
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.techoffice</groupId>
<artifactId>teste</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>Application Test</name>
<description>Teste de descrição do projeto</description>
<url>http://test.techoffice.com.br</url>
</project>

Depois adicionamos algumas dependencias como em um projeto maven padrão.

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>myfaces</groupId>
<artifactId>tomahawk</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
</dependencies>

E agora algumas configurações para fazer com que o maven aceite a estrutura de diretórios do projeto como montamos ele:

<build>
<sourceDirectory>src</sourceDirectory>
<testSourceDirectory>test</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.0</version>
<configuration>
<warSourceDirectory>
${basedir}/WebContent
</warSourceDirectory>
<archiveClasses>true</archiveClasses>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<configuration>
<siteDirectory>${basedir}/site</siteDirectory>
<locales>en,pt</locales>
</configuration>
</plugin>
</plugins>
</build>

sourceDirectory é o parametro que configura o diretório de fontes java.
testSourceDirectory é o diretório que configura o diretório de fontes de teste.
warSourceDirectory dentro do plugin de geração web (maven-war-plugin) é o parametro que diz onde esta a raiz do site.
siteDirectory dentro do plugin de geração do site de documentação (maven-site-plugin) é o parametro que diz onde estão os recursos do site.
e no plugin de compilação, configuramos ele para Java 5.

prontinho, a unica coisa que não funcionou, foi que o arquivo site.xml tem que obrigatoriamente estar no diretório src/site, pois este caminho esta hard coded no código fonte do plugin do maven.

O pom.xml final, ficou com algumas frescuras a mais, alguns relatórios configurados, …
e esta a baixo como exemplo para quem quiser:

<project xmlns=”http://maven.apache.org/POM/4.0.0″
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd”>
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.techoffice</groupId>
<artifactId>teste</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>Application Test</name>
<description>Teste de descrição do projeto</description>
<url>http://test.techoffice.com.br</url>
<issueManagement>
<system>Bugzilla</system>
<url>https://bugzilla.wakaleo.com/</url>
</issueManagement>
<ciManagement>
<system>Continuum</system>
<url>http://integrationserver.wakaleo.com/continuum</url>
<notifiers>
<notifier>
<type>mail</type>
<address>duke@wakaleo.com</address>
</notifier>
</notifiers>
</ciManagement>
<developers>
<developer>
<id>duke</id>
<name>Duke Java</name>
<email>duke@wakaleo.com</email>
<roles>
<role>Project Manager</role>
<role>Architect</role>
</roles>
<organization>Acme.com</organization>
<timezone>-5</timezone>
</developer>
</developers>
<mailingLists>
<mailingList>
<name>HotelDatabase project mailing list</name>
<subscribe>dev-subscribe@wakaleo.com</subscribe>
<unsubscribe>dev-unsubscribe@wakaleo.com</unsubscribe>
<post>dev@wakaleo.com</post>
<archive>
http://mail-archives.wakaleo.com/modmbox/dev/
</archive>
</mailingList>
</mailingLists>
<scm>
<connection>
scm:svn:http://svn.wakaleo.com/hoteldatabase/
</connection>
<developerConnection>
scm:svn:http://svn.wakaleo.com/hoteldatabase/
</developerConnection>
<url>http://svn.wakaleo.com/viewcvs.cgi/hoteldatabase/</url>
</scm>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>myfaces</groupId>
<artifactId>tomahawk</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
<distributionManagement>
<site>
<id>website</id>
<url>scp://www.mycompany.com/www/docs/project/</url>
</site>
</distributionManagement>
<build>
<sourceDirectory>src</sourceDirectory>
<testSourceDirectory>test</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.0</version>
<configuration>
<warSourceDirectory>
${basedir}/WebContent
</warSourceDirectory>
<archiveClasses>true</archiveClasses>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<configuration>
<siteDirectory>${basedir}/site</siteDirectory>
<locales>en,pt</locales>
</configuration>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jxr-maven-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-clover-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<configuration>
<targetjdk>1.5</targetjdk>
<rulesets>
<ruleset>/rulesets/basic.xml</ruleset>
<ruleset>/rulesets/controversial.xml</ruleset>
</rulesets>
<format>xml</format>
<linkXref>true</linkXref>
<sourceEncoding>utf-8</sourceEncoding>
<minimumTokens>100</minimumTokens>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>changes-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>changelog-maven-plugin</artifactId>
</plugin>
</plugins>
</reporting>
</project>

e quem quiser baixar o projeto de testes para dar uma olhadinha é só clicar aqui.

Bom, acho que era isto, agora posso usar o maven para gerenciar os builds dos sistemas, e o Continuum para fazer integração continua de forma bastante fácil :D
Se alguem se mostrar interessado, escrevo um pouquinho sobre as ferramentas de integração continua que testei semana passada.

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Tags: , , ,

Reader's Comments

  1. |

    [...] October 13th, 2006 Bom, a algum tempo eu resolvi começar a usar o Maven 2, e também com o crescimento da equipe, comecei a sentir a necessidade de algum sistema de integração continua. [...]

    Reply to this comment
  2. |

    [...] October 24th, 2006 Yeap, mais um post sobre o Maven 2 O maven 2 alem de todos os beneficios ja conhecidos por nós, aquele monte de relatórios, build simplificado, … ainda tem um monte de plugins bastante interessantes, e que facilitam bastante o desenvolvimento, um deles é este plugin do Jetty para o Maven 2. Este plugin do Jetty faz o seguinte, quando é executada a task: mvn jetty:run ele compila toda a aplicação, e inicializa um container Jetty rodando apenas aquela aplicação para facilitar os testes. [...]

    Reply to this comment
  3. |

    Kra, tenho interesse em saber mais sobre este continuum e por gentilieza escreva um pouco sobre as ferramentas de integração continua que você testou.

    Grato.

    Reply to this comment
  4. |

    Excelente post. Eu e um amigo estamos implementando maven na consultoria onde trabalhamos e um dos principais problemas que encontramos, foi tb o de “ter que se adaptar ao maven” e não ao contrário. Claro, um pequeno probleminha de preguiça de ler o manual =).
    Parabéns e vlw pelo “share”.
    []s

    Reply to this comment
  5. |

    Muito bom o post, tenho trabalhado focado no maven essas semanas e tenho feito várias pesquisas na net. Ando testando a integracao do maven com o hudson. Tenho estudado como fazer a integracao dele com o hudson e com o svn. Outro ponto que estou tentando eh como adicionar a dependencia ao RichFaces, pois ja tentei varias maneiras mas nada. Vc acha que em um ambiente CI os desenvolvedores precisam ter tambem o maven em seu ambiente de trabalho, com o eclipse por exemplo, ou apenas instalado no servidor de CI?
    Muito obrigado,
    igor

    Reply to this comment

Leave a Comment