[Maven] Utilizando a Herança entre Projetos

No post Agregando Projetos, vimos que a principal motivação de separar um projeto em módulos era fazer com que cada parte da aplicação tivesse uma responsabilidade bem definida. Neste tutorial, iremos mostrar outra forma de interação entre módulos: a herança. Muitas vezes, módulos de uma aplicação possuem as mesmas dependências ou declaram as mesmas propriedades. A herança nos permite declarar essas informações apenas uma vez em um projeto pai(parent) e herdá-las em módulos filhos(childs), evitando assim a duplicação e todos os seus problemas.

Como exemplo, vamos criar um projeto simples no qual iremos declarar uma dependência e uma propriedade. Essas declarações serão herdadas posteriormente por outro projeto que criaremos.

Crie um diretório inheritance-project e, dentro deste diretório, salve o arquivo POM que contém as declarações da dependência e da propriedade.

A propriedade parent.encoding será utilizada pelos módulos filhos na configuração do source encoding e a dependência JUnit será utilizada na execução dos testes unitários.

Agora vamos criar o projeto que herdará essas informações. Para isso, crie o diretório child-project dentro de inheritance-project, salve o arquivo pom.xml dentro deste diretório e as classes App e AppTest nos subdiretórios src/main/java/org/andgomes e src/test/java/org/andgomes, respectivamente.

Na seção parent, declaramos as coordenadas(groupId, artifactId e version) do projeto pai de child-project, no nosso caso, o inheritance-project. Perceba que, no arquivo POM do projeto child-project, só especificamos uma coordenada, o artifactId. Não precisamos informar as outras duas por que groupId e version são herdadas do projeto pai. Ou seja, as coordenadas do projeto child-project são: org.andgomes, child-project e 0.0.1.

Além de declarar qual projeto é pai de child-project, utilizamos o valor da propriedade parent.encoding, herdada do projeto inheritance-project, como valor do source encoding de child-project. Em outras palavras, se o valor de parent.encoding é UTF-8, o encoding de child-project será UTF-8.

Vamos dar uma olhada em como ficou a estrutura do diretório inheritance-project depois de termos criado os dois projetos.

pom.xml
child-project/
| pom.xml
| src/
| | main/java/org/andgomes/App.java
| | test/java/org/andgomes/AppTest.java

Para testar se o projeto child-project está herdando a dependência e a propriedade definida pelo inheritance-project, vamos executar um build invocando a fase test. Iremos invocar a fase test por que, para que nossos testes unitários sejam executados corretamente, precisamos ter o JUnit como dependência. Em outras palavras, se a dependência não for herdada, o build deverá falhar.

$ cd inheritance-project
$ cd child-project
$ mvn test

Saída:

[INFO] -----------------------------------------------------------------
[INFO] Building child-project 0.0.1
[INFO] -----------------------------------------------------------------
...
[INFO] Using 'UTF-8' encoding to copy filtered resources.
...
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.andgomes.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.242 sec
...
[INFO] -----------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] -----------------------------------------------------------------

Destaquei as duas partes mais relevantes da execução para podermos ver que tanto a propriedade quanto a dependência foram herdadas pelo projeto child-project. Como esperado, o valor de encoding é o mesmo valor da propriedade parent.encoding e os testes executaram normalmente.

Na herança, quando um módulo declara um projeto parent, o diretório desse projeto deve estar acima no diretório do módulo. Caso o diretório do projeto parent não esteja no nível acima, precisamos adicionar o caminho relativo do POM do projeto parent na seção parent. Por exemplo, se o diretório inheritance-project estiver no mesmo nível do diretório child-project, a declaração na seção parent do arquivo POM de child-project será a seguinte:

Like what you read? Give Anderson Gomes a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.