24 abril 2008

Modularize seu projeto com Maven

Postei isso no Blog da Summa Technologies, onde ainda trabalho, mas gostaria de manter estas informações registradas no meu blog, e por esta razão duplico-o aqui... :)


Organizar um projeto em módulos não é uma má idéia. Colocar um pacote em outro projeto, gerar um jar e fazer a dependência deste num projeto maior, agregador dos módulos, realmente não é complicado (se você entendeu tudo que escrevi!). O desafio aqui está em definir um modelo de release para o projeto e automatizar este processo. O Maven permite isto de uma forma inteligente, descomplicada e organizada. O sofrimento? A documentação de como obter e implantar este processo é pobre.

Após implantarmos este processo em um de nossos projetos, optei por compartilhar aqui o desafio que atravessamos, algo que é de conhecimento aberto a todos, mas que a documentação do Maven não apresenta com clareza.

Preparação


Antes de vermos com detalhe as definições dos POMs, é importante que haja uma noção da arquitetura do Maven e como é o seu funcionamento. Vamos tomar um exemplo quase igual com o que consta na pequena documentação:
-+ myProject/
-|- pom.xml
-+- common/
-|-- pom.xml
-+-- src/
-+--- main/
-+---- java/
-+- web/
-|-- pom.xml
-+-- src/
-+--- main/
-+---- webapp/

Repare que, além do POM principal, para cada módulo existe um POM (pom.xml). No POM raiz, é onde definimos quais os módulos do projeto:
<project>
..
<groupId>summatech</groupId>
<artifactId>myProject</artifactId>
<version>1.0-SNAPSHOT</version>
<name>My Maven Project</name>
<modules>
<module>common</module>
<module>web</module>
</modules>
..
</project>

Desta forma, ao compilarmos, através do Maven, o projeto myProject, este identifica módulos que também devem ser compilados. O processo então será o de executar o mesmo Goal executado em myProject nos subseqüêntes módulos. Caso o goal chamado install seja executado, será gerado pelo Maven os jars dos projetos e ainda o war do projeto web. Temos a partir de agora, uma única chamada para compilar todos os módulos e sub-módulos (sim, é possível definir sub-módulos, mas esse tópico fica para outro post.)

Herança de Dependências Comuns


Outro ponto importante na utilização de módulos, é a possibilidade de poder-se definir no POM principal, configurações de dependências (de outros projetos - como Hibernate) comuns a todos os módulos. Para definir as dependências comuns, vamos tomar um exemplo. No POM principal, inserimos a dependência ao Hibernate assim como em qualquer outro projeto Maven:
<project>
..
<name>My Maven Project</name>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.5.ga</version>
</dependency>
</dependencies>
..
</project>

Além das dependências, configurações de plugins e outros dados podem ser herdados; mas não entrarei em detalhes agora.

Para que os módulos herdem esta dependência do Hibernate, ainda falta um último passo: é necessário que seus POMs façam referência ao parent - ao POM principal. Tomemos por exemplo o POM do módulo common:
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>common</artifactId>
<name>Common Classes for My Project</name>
<parent>
<groupId>summatech</groupId>
<artifactId>myProject</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<packaging>jar</packaging>
</project>


Repare que não foi necessário incluir a tag groupId, já que este atributo será herdado do POM raiz e, afinal de contas, é um módulo e por esta razão, não faz sentido pertencer a outro grupo diferente do de myProject. Além disso, o módulo common também herdou a dependência do Hibernate automaticamente.

Este é o primeiro passo para a modularização de projetos com Maven. Em outro post, apresentarei detalhes sobre como, no módulo web haver uma dependência do módulo common, sem ter que alterar a version manualmente quando há nova versão do módulo. Em um terceiro post, apresentarei o processo para gerar uma versão do projeto modularizado através do Maven.

Até!

3 comentários:

Unknown disse...

blz bruno,
comecei a ler uns tutoriais do maven.
sinceramente ta muito dificil pra mim.
n sei por onde começar.
no meu sistema tem uma pasta com varios jars q precisam ser apagados ou adicionados dependendo do ambiente (des, hom e prod).
na frente de cada arquivo tem o seu respectivo destino: Ex.: HOM_hibernate.cfg.xml, PROD_hibernate.cfg.xml e por ai vai. Sao arquivos de configuracao diferentes para homologacao e producao.
eu queria usar o maven justamente para inserir cada arquivo no seu respectivo lugar ou ate mesmo comentar e descomentar o codigo dentro do proprio arquivo.
tem como?
ja configurei a variavel de ambiente. a versao no cmd é 2.0.9. tentei baixar um plugin pro eclipse, mas ele n executa nada.
pode me ajudar?
vlw

Unknown disse...
Este comentário foi removido pelo autor.
Unknown disse...

http://hotwork.sourceforge.net/hotwork/manual/maven/maven-user-guide.html

nesse tutorial a sintaxe é diferente.
ao inves de usar o arquivo pom.xml ele usao o maven.xml e o project.xml.
o exemplo dele esta mais completo mas n consgio executar os comandos.

Contato

Email:bruno.borges(at)gmail.com

LinkedIn: www.linkedin.com/in/brunocborges
Twitter: www.twitter.com/brunoborges
Comprei e Não Vou
Rio de Janeiro, RJ Brasil
Oracle
São Paulo, SP Brasil