Escopos de dependência do Maven

Escopos de dependência do Maven

1. Introdução

O Maven é uma das ferramentas de construção mais populares no ecossistema Java, e um de seus principais recursos é o gerenciamento de dependências.

Neste artigo, vamos descrever e explorar o mecanismo que ajuda no gerenciamento de dependências transitivas em projetos Maven - escopos de dependência.

2. Dependência transitiva

Simplificando, existem dois tipos de dependências em Mavendirectetransitive.

Dependências diretas são aquelas explicitamente incluídas no projeto. Eles podem ser incluídos no projeto usando tags<dependency>:


    junit
    junit
    4.12

Transitive dependencies, on the other hand, are dependencies required by our direct dependencies. Dependências transitivas necessárias são automaticamente incluídas em nosso projeto pelo Maven.

Podemos listar todas as dependências, incluindo dependências transitivas no projeto usando: comandomvn dependency:tree.

3. Escopos de Dependência

Os escopos de dependência podem ajudar a limitar a transitividade das dependências e modificar o caminho de classe para diferentes tarefas criadas. Maven has 6 default dependency scopes.

E é importante entender que cada escopo - exceto paraimport - tem um impacto nas dependências transitivas.

3.1. Compilar

Este é o escopo padrão quando nenhum outro escopo é fornecido.

Dependências com este escopo estão disponíveis no classpath do projeto em todas as tarefas de construção e são propagadas para os projetos dependentes.

Mais importante, essas dependências também são transitivas:


    commons-lang
    commons-lang
    2.6

3.2. Forneceu

Este escopo é usado para marcardependencies that should be provided at runtime by JDK or a container, daí o nome.

Um bom caso de uso para esse escopo seria um aplicativo da web implantado em algum contêiner, em que o contêiner já fornece algumas bibliotecas.

Por exemplo, um servidor web que já fornece a API Servlet em tempo de execução, portanto, em nosso projeto, essas dependências podem ser definidas com o escopoprovided:


    javax.servlet
    servlet-api
    2.5
    provided

As dependênciasprovided estão disponíveis apenas em tempo de compilação e no classpath de teste do projeto; além do mais, eles não são transitivos.

3.3. Tempo de execução

The dependencies with this scope are required at runtime, mas eles não são necessários para a compilação do código do projeto. Por causa disso, as dependências marcadas com o escoporuntime estarão presentes no tempo de execução e no classpath de teste, mas estarão ausentes no classpath de compilação.

Um bom exemplo de dependências que devem usar o escopo de tempo de execução é um driver JDBC:


    mysql
    mysql-connector-java
    6.0.6
    runtime

3.4. Test

Este escopo é usado para indicar que a dependência não é necessária no tempo de execução padrão do aplicativo, mas é usado apenas para fins de teste. Test dependencies aren’t transitive and are only present for test and execution classpaths.

O caso de uso padrão para esse escopo é adicionar uma biblioteca de teste como JUnit ao nosso aplicativo:


    junit
    junit
    4.12
    test

3.5. Sistema

System scope is much similar to the provided scope. A principal diferença entre esses dois escopos é quesystem exige que apontemos diretamente para jar específico no sistema.

O importante a lembrar é que construir o projeto com dependências de escoposystem pode falhar em máquinas diferentes se as dependências não estiverem presentes ou estiverem localizadas em um lugar diferente daquele quesystemPath aponta para:


    com.example
    custom-dependency
    1.3.2
    system
    ${project.basedir}/libs/custom-dependency-1.3.2.jar

3.6. Importar

Este escopo foi adicionado no Maven 2.0.9 eit’s only available for the dependency type pom.. Falaremos mais sobre o tipo de dependência em artigos futuros.

Import indica que esta dependência deve ser substituída por todas as dependências efetivas declaradas em seu POM:


    com.example
    custom-project
    1.3.2
    pom
    import

4. Escopo e transitividade

Cada escopo de dependência afeta dependências transitivas à sua maneira. Isso significa que diferentes dependências transitivas podem acabar no projeto com diferentes escopos.

No entanto, dependências com escoposprovidedetest nunca serão incluídas no projeto principal.

Então:

  • Para o escopocompile, todas as dependências comruntime scope serão puxadas com o escoporuntime, no projeto e todas as dependências com o escopocompile serão puxadas com o Escopo decompile, no projeto

  • Para o escopoprovided, as dependências de escoporuntime ecompile serão puxadas com o escopoprovided, no projeto

  • Para o escopotest, as dependências transitivas do escoporuntime ecompile serão puxadas com o escopotest, no projeto

  • Para o escoporuntime, as dependências transitivas do escoporuntime ecompile serão puxadas com o escoporuntime, no projeto

5. Conclusão

Neste tutorial rápido, focamos nos escopos de dependência do Maven, em seus propósitos e nos detalhes de como eles operam.

Se você quiser se aprofundar no Maven, odocumentation é um ótimo lugar para começar.