quinta-feira, abril 26, 2012

Maven: múltiplos projetos interdependentes

Dando continuidade a temática que envolve maven, mais especificamente, de ferramentas para controle de dependências (artefatos) e build automático, vou abordar como se dá o trabalho e relação de múltiplos projetos no contexto do maven.

A necessidade de se utilizar múltiplos projetos para a construção de uma aplicação acarreta grandes vantagens, principalmente, quanto a melhores práticas e um melhor design arquitetural da aplicação; pois, assim, pode-se estabelecer de forma mais impositiva maior coesão e menor acoplamento. Em termos mais práticos, pode-se construir uma aplicação modularizada de forma bastante prática e eficaz.

Escopo
Deseja-se criar uma aplicação modular, onde as responsabilidades de persistência, negócio e visualização devem ser desacopladas. Adotaremos como solução a criação de 3 projetos, um para cada finalidade.

O diagrama, a seguir, ilustra a estrutura a ser criada:
Pelo diagrama, observa-se que a camada de View irá ter visibilidade (dependência) a camada de negócio e, esta última visibilidade a camada de dados/persistência.

Construção

Como já discutido nos posts anteriores sobre maven, este utiliza o arquivo pom.xml para estabelecer a estrutura, dependências e uma série de diretrizes inerentes ao build do projeto. Como visto no diagrama, entende-se, preliminarmente, que teremos 3 projetos que possuirão interdependência, logo 3 arquivos pom.xml, correspondentes a cada projeto individual.
Está correto, como uma ressalva: será necessário a criação do pom pai (parent pom.xml). Este arquivo pom não fará correspondência a nenhum projeto, será apenas um arquivo para a gerência macro dos 3 módulos.

O primeiro passo será a criação do parent pom, para tanto crie um arquivo no seu editor de textos simples e salve-o num diretório de sua preferência (este diretório que irá conter o projeto em seguida), com o nome de: pom.xml. Neste arquivo, cole o seguinte conteúdo:



  4.0.0

  com.serjava.app
  app
  1.0-SNAPSHOT
  pom

  
   
  

Observe que definimos o groupId como: com.serjava.app, e o nome de app ou artifactId como: app. Salve o arquivo, e vamos proceder a criação dos projetos.

No prompt de comando/terminal acesse o diretório onde o arquivo foi salvo, e crie os projetos como:

Projeto: app-web

Durante o processo de criação será solicitado uma versão, informe: 1.0 (snapshot); posteriormente, será apresentado um resumo das parametrizações, informe Y para confirmar e tecle enter.

Feito isto o projeto web já foi criado!

Façamos 2 observações:
Abra o arquivo pom.xml criado inicialmente, no diretório raiz do projeto, verifique que houve uma alteração:

Observe que um módulo foi imputado automáticamente, isto significa que: o projeto criado (app-web) será gerenciado, também, pelo parent pom!

A segunda observação é: abra o pom.xml do projeto criado: <<diretorio escolhido>>\app-web\pom.xml, e veja, dentre as demais tags de configuração a tag <parent>, esta faz referência ao parent pom (pom pai) criado inicialmente:

    app
    com.serjava.app
    1.0-SNAPSHOT
  

Projeto: app-business

A única diferença deste projeto para o primeiro foi a alteração do seu nome, e archetypeArtifactId para quickstart, pois é apenas um projeto para a lógica de negócios, não compreende estrutura web.

Projeto: app-dao

Neste momento deveremos dispor dos três projetos: web, business e dao, todos gerenciados pelo parent pom, criado incialmente! Verifique o arquivo pom parent, na tag module, deverá terem sido incluídas mais 2 módulos.

Os projetos já estão devidamente criados segundo o diagrama, resta-nos, agora, adicionar as dependências citadas. Conforme entendido, o projeto web terá visibilidade apenas ao projeto de business, portanto, teremos que adicionar a dependência. Abra o arquivo pom.xml do projeto app-web, e modifique-o como a seguir:

  4.0.0
  
    app
    com.serjava.app
    1.0-SNAPSHOT
  
  com.serjava.app
  app-web
  1.0
  war
  app-web Maven Webapp
  http://maven.apache.org
  

    
      com.serjava.app
      app-business
      1.0
      compile
    


    
      junit
      junit
      3.8.1
      test
    
  
  
    app-web
  

Observe que uma dependência foi incluída, referenciando-se aos dados de criação do projeto app-business, esta inclusão permitirá acesso chamada de métodos do projeto app-business, a partir do projeto app-web; assim, estaremos delegando toda a lógica de negócio desta fantástica aplicação a um projeto único e específico a isto, permitindo que o projeto web trate apenas de manipulações de pertinentes a visualização.

Finalmente, devemos adicionar a dependência do projeto dao ao projeto business. Ressalto que: o projeto business será para o processo de negócio e não persistência de dados (seja em database, arquivo, etc), para persistir temos o projeto específico de Data Access Object. Utilizando esta estrutura, assumimos que todos os detalhes e especificidades de acesso a dados estarão contidas no projeto DAO.

Edite o arquivo pom.xml do projeto app-business e inclua a seguinte dependência:

  4.0.0
  
    app
    com.serjava.app
    1.0-SNAPSHOT
  
  com.serjava.app
  app-business
  1.0
  app-business
  http://maven.apache.org
  

    
      com.serjava.app
      app-dao
      1.0
      compile
    


    
      junit
      junit
      3.8.1
      test
    
  


Concluída a edição nosso projeto poderá ser devidamente implementado, seguindo o fluxo: app-web faz uma requisição ao app-business, este, por sua vez, realiza a lógica de negócio e faz as chamadas necessárias para acesso aos dados, no app-dao.

Todos os arquivos devidamente salvos, testaremos o empacotamento, gerando um package, digite o seguinte comando no prompt/terminal, esteja ciente que está dentro do diretório pai, e não em algum projeto específico:

mvn clean package

O resultado esperado deverá ser:

Verifique BUILD SUCESS! Pronto, basta partir para a codificação.

Num post futuro, mostrarei como fazer o deploy de uma aplicação diretamente a um servidor web por meio do maven, não perca!

2 comentários:

  1. EXCELENTE!

    Só acredito que talvez a utilização do MAVEN via plugins nas IDE's seja mais fácil e inteligível para usuários iniciantes.

    Parabéns pelo POST

    ResponderExcluir
    Respostas
    1. Particularmente prefiro a utilização de maven sem os plugins da IDE, noto ser mais produtivo. Certamente o usuário que tiver interesse, há bons plugins para o eclipse.

      Excluir