Mola com Maven BOM

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 é:

  1. A versão da declaração direta do artefato em nosso pom do projeto

  2. A versão do artefato no projeto pai

  3. A versão no pom importado, levando em consideração a ordem de importação de arquivos

  4. 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.