Projeto de múltiplos módulos com Maven
1. Visão geral
Neste tutorial, mostraremos como construir um projeto multi-módulo com Maven.
Primeiro, discutiremos o que é um projeto com vários módulos e daremos uma olhada nos benefícios de seguir essa abordagem. Em seguida, configuraremos nosso projeto de amostra. Para uma boa introdução ao Maven, verifiquethis tutorial.
2. Projeto multi-módulo do Maven
Um projeto de vários módulos é construído a partir de um POM agregador que gerencia um grupo de submódulos. Na maioria dos casos, o agregador está localizado no diretório raiz do projeto e deve ter um pacote do tipopom.
Agora, os submódulos são projetos regulares do Maven e podem ser construídos separadamente ou por meio do POM agregador.
Ao construir o projeto por meio do POM agregador, cada projeto que possui um tipo de embalagem diferente depom resultará em um arquivo compactado construído.
3. Benefícios do uso de vários módulos
A vantagem significativa de usar esta abordagem é quewe may reduce duplication.
Digamos que temos um aplicativo que consiste em vários módulos, seja um módulo front-end e um módulo back-end. Agora, trabalhamos em ambos e alteramos a funcionalidade que afeta os dois. Nesse caso, sem uma ferramenta de construção especializada, teremos que construir ambos os componentes separadamente ou escrever um script que compilaria o código, executaria testes e mostraria os resultados. Então, depois de obtermos ainda mais módulos no projeto, será mais difícil gerenciar e manter.
Além disso, no mundo real, os projetos podem precisar de certos plug-ins Maven para realizar várias operações durantebuild lifecycle, compartilhar dependências e perfis ou incluir outrosBOM projects.
Portanto, ao aproveitar multimódulos, podemosbuild our application’s modules in a single commande a ordem for importante, o Maven resolverá isso para nós. Além disso, podemosshare a vast amount of configuration with other modules.
4. POM pai
O Maven suporta herança de uma maneira queeach pom.xml file has the implicit parent POM, it’s called Super POMe pode ser localizado nos binários do Maven. Esses dois arquivos são mesclados pelo Maven e formam o POM efetivo.
Portanto, podemos criar nossoown pom.xml file which will serve us as the parent project. Então, podemos incluir lá todas as configurações com dependências e definir isso como o pai de nossos módulos filhos, para que eles herdem dele.
Além da herança, o Maven fornece a noção de agregação. O POM pai que aproveita essa funcionalidade é chamado de POM. agregado. Basicamente, esse tipo de POMdeclares its modules explicitly in its pom.xml file.
5. Submodules
Sub-módulos ou subprojetos são projetos regulares do Maven que herdam do POM pai. Como já sabemos, a herança permite compartilhar a configuração e as dependências com os submódulos. No entanto, se quisermos construir ou lançar nosso projeto de uma só vez, temos que declarar nossos submódulos explicitamente no POM pai. Por fim, nosso POM pai será o pai e o POM agregado.
6. Construindo o aplicativo
Agora que entendemos os submódulos e a hierarquia do Maven, vamos construir um aplicativo de amostra para demonstrá-los. Usaremos a interface de linha de comando do Maven para gerar nossos projetos.
Este aplicativo será composto por três módulos, que representarão:
-
Ocore part de nosso domínio
-
Umservice da web espalhando algumas APIs REST
-
Umwebapp contendo ativos da web voltados para o usuário de algum tipo
Como vamos nos concentrar no Maven, a implementação desses serviços permanecerá indefinida.
6.1. Gerando POM pai
First, let’s create a parent project:
mvn archetype:generate -DgroupId=org.example -DartifactId=parent-project
Uma vez que o pai é gerado, temos que abrir o arquivopom.xml localizado no diretório do pai e alterar a embalagem para pom.
pom
Ao definir o pacote como tipo pom, declaramos que o projeto servirá como pai ou agregador - não produzirá mais artefatos.
Agora, como nosso agregador está pronto, podemos gerar nossos submódulos.
No entanto, precisamos observar que este é o local em que toda a configuração a ser compartilhada está localizada e, eventualmente, reutilizada nos módulos filhos. Entre outras coisas, podemos fazer uso dedependencyManagement oupluginManagement aqui.
6.2. Criando submódulos
Como nosso POM pai foi nomeadoparent-project, precisamos nos certificar de que estamos no diretório do pai e executar os comandosgenerate:
cd parent-project
mvn archetype:generate -DgroupId=org.example -DartifactId=core
mvn archetype:generate -DgroupId=org.example -DartifactId=service
mvn archetype:generate -DgroupId=org.example -DartifactId=webapp
Observe o comando usado. É o mesmo que usamos para os pais. A questão aqui é que esses módulos são projetos regulares do Maven, mas o Maven reconheceu que eles estão aninhados. Quando mudamos o diretório paraparent-project, descobrimos que o pai tem um pacote do tipopome modificou os doispom.xml files de acordo.
Depois disso, o Maven irá gerar três submódulos e modificar para nós o arquivopom.xml do pai, adicionando algumas tags:
core
service
webapp
Agora, nosso pai declara explicitamente os módulos agregados.
Em seguida, ao executar o comandomvn package no diretório do projeto pai, o Maven construirá e testará todos os três módulos.
Além disso, o Maven Reactor analisará nosso projeto e o construirá na ordem correta. Portanto, se nosso módulowebapp depende do módulothe service, o Maven construirá primeiro oservice, depois owebapp.
Afinal, se quisermos compartilhar toda a configuração com nossos submódulos, em seus arquivospom.xml, teremos que declarar o pai:
org.example
parent-project
1.0-SNAPSHOT
Precisamos observar que os submódulos podem ter apenas um pai. No entanto, podemos importar muitas listas técnicas. Mais detalhes sobre os arquivos BOM podem ser encontrados emthis article.
6.3. Construindo o Projeto
Now we can build all three modules at once. No diretório do projeto pai, execute:
mvn package
Isso criará todos os módulos; devemos ver a seguinte saída do comando:
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] parent-project
[INFO] core
[INFO] service
[INFO] webapp
...
[INFO] Reactor Summary:
[INFO] parent-project ..................................... SUCCESS [ 0.140 s]
[INFO] core ............................................... SUCCESS [ 2.195 s]
[INFO] service ............................................ SUCCESS [ 0.767 s]
[INFO] webapp ............................................. SUCCESS [ 0.572 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
O Reactor lista osparent-project, mas como é o tipopom, ele é excluído e a compilação resulta em três arquivos.jar separados para todos os outros módulos. Nesse caso, a compilação ocorre em três deles.
7. Conclusão
Neste tutorial, discutimos os benefícios do uso de multi-módulos Maven. Além disso, distinguimos entre o POM pai do Maven regular e o POM agregado. No final, mostramos como configurar um multi-módulo simples para começar a jogar.
O Maven é uma ótima ferramenta, mas é complexo por si só. Se você deseja encontrar mais detalhes sobre o Maven, dê uma olhada emSonatype Maven reference ouApache Maven guides. Se você procura usos avançados da configuração de vários módulos Maven, dê uma olhada emhow Spring Boot project leverages the usage of it.
Todos os exemplos de código do exemplo são construídos usando Maven, portanto, você pode facilmente verificar nossoGitHub project website para ver várias configurações Maven.