Mola com Maven BOM
1. Visão geral
Neste tutorial rápido, vamos ver como o Maven, uma ferramenta baseada no conceito de Project Object Model (POM), pode fazer uso de um BOM ou “Bill Of Materials”.
Para mais detalhes sobre o Maven, você pode verificar nosso artigoApache Maven Tutorial.
2. Conceitos de Gerenciamento de Dependência
Para entender o que é uma BOM e para que podemos usá-la, primeiro precisamos aprender conceitos básicos.
2.1. O que é o Maven POM?
O Maven POM é um arquivo XML que contém informações e configurações (sobre o projeto) usadas pelo Maven para importar dependências e criar o projeto.
2.2. O que é o Maven BOM?
BOM significa Lista de materiais. A BOM is a special kind of POM that is used to control the versions of a project’s dependencies and provide a central place to define and update those versions.
A BOM fornece a flexibilidade de adicionar uma dependência ao nosso módulo sem se preocupar com a versão da qual devemos confiar.
2.3. Dependências transitivas
O Maven pode descobrir as bibliotecas que são necessárias para nossas próprias dependências em nossopom.xmle inclui-as automaticamente. Não há limite para o número de níveis de dependência dos quais as bibliotecas são reunidas.
O conflito ocorre aqui quando duas dependências se referem a versões diferentes de um artefato específico. Qual será incluído pelo Maven?
A resposta aqui é a “definição mais próxima”. Isso significa que a versão usada será a mais próxima do nosso projeto na árvore de dependências. Isso é chamado de mediação de dependência.
Vejamos o seguinte exemplo para esclarecer a mediação de dependência:
A -> B -> C -> D 1.4 and A -> E -> D 1.0
Este exemplo mostra que o projetoA depende deB eE.BeE têm suas próprias dependências que encontram diferentes versões do artefatoD . O artefatoD 1.0 será usado na construção do projetoA porque o caminho por meio deE é mais curto.
Existem diferentes técnicas para determinar qual versão dos artefatos deve ser incluída:
-
Sempre podemos garantir uma versão, declarando-a explicitamente no POM do nosso projeto. Por exemplo, para garantir queD 1.4 seja usado, devemos adicioná-lo explicitamente como uma dependência no arquivopom.xml.
-
Podemos usar a seçãoDependency Management para controlar as versões dos artefatos, conforme explicaremos mais adiante neste artigo.
2.4. Gerenciamento de Dependências
Simplificando, o Gerenciamento de Dependências é um mecanismo para centralizar as informações de dependência.
Quando temos um conjunto de projetos que herdam um pai comum, podemos colocar todas as informações de dependência em um arquivo POM compartilhado chamado BOM.
A seguir, é apresentado um exemplo de como gravar um arquivo BOM:
4.0.0
example
example-BOM
0.0.1-SNAPSHOT
pom
example-BOM
parent pom
test
a
1.2
test
b
1.0
compile
test
c
1.0
compile
Como podemos ver, o BOM é um arquivo POM normal com uma seçãodependencyManagement, onde podemos incluir todas as informações e versões de um artefato.
2.5. Usando o arquivo BOM
Existem duas maneiras de usar o arquivo BOM anterior em nosso projeto e, em seguida, estaremos prontos para declarar nossas dependências sem precisar nos preocupar com os números de versão.
Podemos herdar do pai:
4.0.0
example
Test
0.0.1-SNAPSHOT
pom
Test
example
example-BOM
0.0.1-SNAPSHOT
Como podemos ver, nosso projeto Test herda o exemplo-BOM.
Também podemos importar o BOM.
Em projetos maiores, a abordagem de herança não é eficiente porque o projeto pode herdar apenas um único pai. A importação é a alternativa, pois podemos importar quantas listas técnicas forem necessárias.
Vamos ver como podemos importar um arquivo BOM para nosso projeto POM:
4.0.0
example
Test
0.0.1-SNAPSHOT
pom
Test
example
example-BOM
0.0.1-SNAPSHOT
pom
import
2.6. Substituindo dependência de lista técnica
A ordem de precedência da versão do artefato é:
-
A versão da declaração direta do artefato em nosso pom do projeto
-
A versão do artefato no projeto pai
-
A versão no pom importado, levando em consideração a ordem de importação de arquivos
-
mediação de dependência
-
Podemos substituir a versão do artefato definindo explicitamente o artefato no pom do nosso projeto com a versão desejada
-
Se o mesmo artefato for definido com versões diferentes em 2 BOMs importadas, a versão no arquivo da BOM que foi declarada primeiro ganhará
-
3. Spring BOM
Podemos descobrir que uma biblioteca de terceiros, ou outro projeto Spring, gera uma dependência transitiva para uma versão anterior. Se esquecermos de declarar explicitamente uma dependência direta, poderão surgir problemas inesperados.
Para superar esses problemas, o Maven suporta o conceito de dependência da BOM.
Podemos importarspring-framework-bom em nossa seçãodependencyManagement para garantir que todas as dependências do Spring estejam na mesma versão:
org.springframework
spring-framework-bom
4.3.8.RELEASE
pom
import
Não precisamos especificar o atributoversion quando usamos os artefatos Spring como no exemplo a seguir:
org.springframework
spring-context
org.springframework
spring-web
4. Conclusão
Neste artigo rápido, mostramos o conceito Maven Bill-Of-Material e como centralizar as informações e versões do artefato em um POM comum.
Simplificando, podemos herdá-lo ou importá-lo para fazer uso dos benefícios da lista técnica.
Os exemplos de código no artigo podem ser encontradosover on GitHub.