[Maven] Tipos de Escopo de Dependência

Toda vez que um projeto A declara um projeto B como dependência, se B é dependente de outros projetos, alguns desses artefatos podem se tornar dependências transitivas de A. Se B é uma dependência trazida de um repositório remoto, essas dependências transitivas também são baixadas para o repositório local.

Para limitar a quantidade de dependências transitivas trazidas de um repositório, o Maven permite a especificação de escopo na declaração das dependências. Há cinco tipos de escopo: compile, runtime, test, provided e system. Os três primeiros estão relacionados ao momento em que a dependência é utilizada. Se uma dependência só é necessária para os testes, não é preciso que ela seja trazida como dependência transitiva(já que o Maven não inclui as classes de teste quando o artefato é instalado no repositório).

Segue abaixo uma breve descrição de cada tipo de escopo. Ao final da descrição é informado se uma dependência com aquele tipo de escopo é incluída como dependência transitiva ou não.

compile: Se nenhum escopo for especificado para uma dependência, compile é o padrão. Se uma dependência tem o escopo compile, ela será incluída em todos os classpaths do projeto. Transitivo

runtime: Uma dependência com o escopo runtime é necessária na execução e nos testes, mas não na compilação das classes. Por consequência, a dependência é incluída nos classpaths dessas duas fases. Transitivo

test: O escopo test deve ser especificado nas dependências que são utilizadas nas classes de teste. Nos tutoriais anteriores, quando criamos projetos com o archetype Quickstart, o JUnit já era incluído com esse escopo. Uma dependência com o escopo test é incluída na compilação e execução dos testes. Não-Transitivo

provided: Se uma dependência tem o escopo provided, assume-se que ela será fornecida pelo ambiente de execução onde o projeto será compilado e executado. Por exemplo, a Servlet API geralmente deve ser declarada com o escopo provided, pois o Web Container contém e utiliza o arquivo JAR da API na compilação e tempo de execução. Não-Transitivo

system: O escopo system é similar ao provided, a diferença é que o caminho do artefato deve ser especificado na declaração da dependência(através da tag systemPath). Devido a isso, perceba que, ao menos em um ambiente totalmente controlado, esse escopo pode levar a sérios problemas de portabilidade. Não-Transitivo

A partir da versão 2.0.9 do Maven, um tipo de escopo especial foi incluído: o import. O escopo import é utilizado especificamente no gerenciamento de dependências em projetos com muitos módulos, com o intuito de evitar declarações da mesma dependência espalhadas nos vários arquivos POM do projeto. Como a explicação desse escopo requer alguns exemplos para ficar mais clara, deixaremos esse assunto para outro post.

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.