Qual é a diferença entre a dependência do tipo “pom” com escopo “import” e sem “import”?

112

A partir do Maven 2.0.9, existe a possibilidade de incluir

<type>pom</type>
<scope>import</scope>

na <dependencyManagement>seção.

Pelo que entendi, ele será "substituído" pelas dependências incluídas neste pom como se tivessem sido definidas originalmente aqui.

Qual é a diferença entre a solução acima e a dependência simples para este pom sem importescopo (eu vi o último ser chamado de "agrupamento de dependências")? A única diferença é que essas dependências "agrupadas" têm prioridade mais baixa ao resolver a precedência das dependências?

grafthez
fonte

Respostas:

187

Você só pode importar dependências gerenciadas . Isso significa que você só pode importar outros POMs para a dependencyManagementseção do POM do seu projeto. ie

...
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>other.pom.group.id</groupId>
            <artifactId>other-pom-artifact-id</artifactId>
            <version>SNAPSHOT</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>   
    </dependencies>
</dependencyManagement>
...

O que acontece então é que todas as dependências definidas na dependencyManagementseção do other-pom-artifact-idsão incluídas na dependencyManagementseção do seu POM . Você pode então fazer referência a essas dependências na dependencyseção de seu POM (e todos os seus POMs filhos) sem ter que incluir um versionetc.

No entanto, se em seu POM você simplesmente definir uma dependência normal, other-pom-artifact-identão todos dependenciesda dependencyseção do other-pom-artifact-idsão incluídos transitivamente em seu projeto - no entanto, as dependências definidas na dependencyManagementseção do other-pom-artifact-idnão são incluídas de forma alguma.

Então, basicamente, os dois mecanismos diferentes são usados ​​para importar / incluir os dois tipos diferentes de dependências (dependências gerenciadas e dependências normais).

Há uma boa página no site do maven, que pode explicar isso muito melhor do que eu, Gerenciamento de dependências no Maven, e também contém informações específicas sobre a importação de dependências .

DB5
fonte
1
Se pomA in for pai de pomB, você pode colocar B no gerenciamento de dependência do projeto A com escopo import?
Janez Kuhar
ótima resposta para explicar como funciona, mas por quê ?? porque você não quer incluir as outras dependências transitivamente? também você pode fazer os dois? importar other-pom-artifact-id e, em seguida, declarar other-pom-artifact-id como dependência também?
Junchen Liu
Um artigo na DZone afirma algo diferente: ... <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-lib</artifactId> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-war</artifactId> <type>war</type> </dependency> </dependencies> </project>DRY and Skinny War
coz
1
@JunchenLiu: Digamos que você esteja usando apenas alguns recursos do projeto A, portanto, pode escolher incluir apenas as dependências transitivas necessárias para esse recurso. Você pode descobrir isso usando <exclude> em <dependency> também. Por exemplo, confira este: jdbi.org/#_getting_started
Nitiraj
15

Você não pode ter um pomprojeto de tipo como simple dependencyem outro projeto. (Bem, você pode - mas não fará nada de útil). Só pode haver um parent-childrelacionamento. Isso é essencialmente managing dependency through inheritance.

importescopo para pomdependência de tipo na <dependencyManagement>seção permite que você obtenha o equivalente a multiple inheritance.

Você poderia ter diferentes poms- cada managingum com um monte de dependências relacionadas. Os projetos que usam estes podem importestes pomse então especificar as dependências que eles precisam sem precisar se preocupar com a versão. Este é essencialmente o bill of materialsconceito, que é ilustrado nos links especificados por @ DB5.

Isso ajuda a evitar que parent pomsprojetos complexos de vários módulos fiquem muito grandes e complicados.

Raghuram
fonte
8
Você tem certeza? Coloquei o pom regular (tendo suas próprias dependências) como uma dependência regular em outro projeto (war de empacotamento) e tenho todas as dependências do projeto pom incluídas no WEB-INF / lib do projeto de destino. É por isso que estou fazendo esta pergunta :)
grafthez
2
Obrigado @Raghuram, esqueci totalmente de mencionar a opção POM dos pais ao responder a pergunta. Quanto a ter um projeto do tipo pom como uma dependência simples, isso é possível. Conforme mencionado na pergunta original, ele pode ser usado para agrupar dependências
DB5
5

Dois conceitos, muito semelhantes ao paradigma de programação orientada a objetos, ajudarão a responder à pergunta:

  1. A seção dependencyManagement apenas declara as dependências e seus detalhes no projeto atual - o objetivo é o gerenciamento dos detalhes e a reutilização em outros projetos, seja por herança ( pai ) ou importação ( escopo ). É como declarar um tipo de dado em um programa e torná-lo disponível para uso.

  2. A seção de dependência define o uso real das dependências no projeto, opcionalmente, herda os detalhes (ou seja, a versão, etc.) das dependências declaradas no dependencyManagment . É por isso que você terá dependências ausentes se apenas colocá-las em dependencyManagment . Isso é análogo a instanciar uma instância variável de um tipo de dados em um programa onde ele é necessário.

furgão
fonte
Isso é bom e claro, mas responde a uma pergunta diferente da anterior. :-)
Rick-777