Maven - Gerenciar Dependências

Um dos principais recursos do Maven é o gerenciamento de dependências. Gerenciar dependências é uma tarefa difícil, uma vez que lidamos com projetos de vários módulos (consistindo em centenas de módulos / subprojetos). O Maven fornece um alto grau de controle para gerenciar tais cenários.

Descoberta de dependências transitivas

É muito comum quando uma biblioteca, digamos A, depende de outra biblioteca, digamos B. No caso de outro projeto C querer usar A, então esse projeto requer o uso da biblioteca B também.

O Maven ajuda a evitar tais requisitos para descobrir todas as bibliotecas necessárias. O Maven faz isso lendo arquivos de projeto (pom.xml) de dependências, descobrindo suas dependências e assim por diante.

Precisamos apenas definir a dependência direta em cada pom do projeto. O Maven cuida do resto automaticamente.

Com dependências transitivas, o gráfico das bibliotecas incluídas pode crescer rapidamente em grande extensão. Podem surgir casos quando há bibliotecas duplicadas. O Maven fornece poucos recursos para controlar a extensão das dependências transitivas.

Sr. Não. Recurso e descrição
1

Dependency mediation

Determina qual versão de uma dependência deve ser usada quando várias versões de um artefato são encontradas. Se duas versões de dependência estiverem na mesma profundidade na árvore de dependências, a primeira dependência declarada será usada.

2

Dependency management

Especifique diretamente as versões dos artefatos a serem usados ​​quando forem encontrados em dependências transitivas. Para um exemplo de projeto, C pode incluir B como uma dependência em sua seção de gerenciamento de dependências e controlar diretamente qual versão de B deve ser usada sempre que for referenciada.

3

Dependency scope

Inclui dependências de acordo com o estágio atual da construção.

4

Excluded dependencies

Qualquer dependência transitiva pode ser excluída usando o elemento "exclusão". Como exemplo, A depende de B e B depende de C, então A pode marcar C como excluído.

5

Optional dependencies

Qualquer dependência transitiva pode ser marcada como opcional usando o elemento "opcional". Como exemplo, A depende de B e B depende de C. Agora, B marcou C como opcional. Então A não usará C.

Escopo de Dependência

A descoberta de dependências transitivas pode ser restringida usando vários Escopos de dependência conforme mencionado abaixo.

Sr. Não. Escopo e descrição
1

compile

Este escopo indica que a dependência está disponível no caminho de classe do projeto. É o escopo padrão.

2

provided

Este escopo indica que a dependência deve ser fornecida pelo JDK ou Web-Server / Container no tempo de execução.

3

runtime

Este escopo indica que a dependência não é necessária para compilação, mas é necessária durante a execução.

4

test

Este escopo indica que a dependência está disponível apenas para as fases de compilação e execução de teste.

5

system

Este escopo indica que você deve fornecer o caminho do sistema.

6

import

Este escopo é usado apenas quando a dependência é do tipo pom. Este escopo indica que o POM especificado deve ser substituído pelas dependências na seção <dependencyManagement> desse POM.

Gestão de Dependências

Normalmente, temos um conjunto de projetos sob um projeto comum. Nesse caso, podemos criar um pom comum com todas as dependências comuns e, em seguida, tornar esse pom, o pai dos poms do subprojeto. O exemplo a seguir ajudará você a entender esse conceito.

A seguir estão os detalhes do gráfico de dependência acima -

  • App-UI-WAR depende de App-Core-lib e App-Data-lib.
  • Root é pai de App-Core-lib e App-Data-lib.
  • Root define Lib1, lib2, Lib3 como dependências em sua seção de dependências.

App-UI-WAR

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>App-UI-WAR</artifactId>
   <version>1.0</version>
   <packaging>war</packaging>
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname</groupId>
         <artifactId>App-Core-lib</artifactId>
         <version>1.0</version>
      </dependency>
   </dependencies>  
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname</groupId>
         <artifactId>App-Data-lib</artifactId>
         <version>1.0</version>
      </dependency>
   </dependencies>  
</project>

App-Core-lib

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
      <artifactId>Root</artifactId>
      <groupId>com.companyname.groupname</groupId>
      <version>1.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>App-Core-lib</artifactId>
   <version>1.0</version> 
   <packaging>jar</packaging>
</project>

App-Data-lib

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
      <artifactId>Root</artifactId>
      <groupId>com.companyname.groupname</groupId>
      <version>1.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>App-Data-lib</artifactId>
   <version>1.0</version>   
   <packaging>jar</packaging>
</project>

Root

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>Root</artifactId>
   <version>1.0</version>
   <packaging>pom</packaging>
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname1</groupId>
         <artifactId>Lib1</artifactId>
         <version>1.0</version>
      </dependency>
   </dependencies>  
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname2</groupId>
         <artifactId>Lib2</artifactId>
         <version>2.1</version>
      </dependency>
   </dependencies>  
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname3</groupId>
         <artifactId>Lib3</artifactId>
         <version>1.1</version>
      </dependency>
   </dependencies>  
</project>

Agora, quando construirmos o projeto App-UI-WAR, o Maven descobrirá todas as dependências percorrendo o gráfico de dependências e construirá o aplicativo.

Com o exemplo acima, podemos aprender os seguintes conceitos-chave -

  • Dependências comuns podem ser colocadas em um único lugar usando o conceito de pom pai. Dependências deApp-Data-lib e App-Core-libprojeto estão listados no projeto Root (consulte o tipo de pacote de Root. É POM).

  • Não há necessidade de especificar Lib1, lib2, Lib3 como dependência em App-UI-WAR. Maven usa oTransitive Dependency Mechanism para gerenciar esses detalhes.