2012-08-02 14 views
71

Partiendo de Maven 2.0.9 existe posibilidad de incluir¿Cuál es la diferencia entre el alcance de "importación" y la dependencia de tipo "pom"?

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

en la sección <dependencyManagement>.

Según tengo entendido, será "reemplazado" por las dependencias incluidas en este pom como si se hubieran definido originalmente aquí.

¿Cuál es la diferencia entre la solución anterior y la dependencia simple de este pom sin alcance import (vi que este último se llamaba "agrupación de dependencias")? ¿La única diferencia es que estas dependencias "agrupadas" tienen menor prioridad mientras se resuelve la precedencia de las dependencias?

Respuesta

130

Solo puede importar dependencias gestionadas. Esto significa que solo puede importar otros POM en la sección dependencyManagement del POM de su proyecto. es decir,

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

Lo que sucede entonces es que todas las dependencias definidas en la sección dependencyManagement del other-pom-artifact-id se incluyen en la sección de su POM dependencyManagement. A continuación, puede hacer referencia a estas dependencias en la sección dependency del POM (y todos sus POM niño) sin tener que incluir una version etc.

Sin embargo, si en su POM sólo tiene que definir una dependencia normal a other-pom-artifact-id entonces todo dependencies de la sección dependency de other-pom-artifact-id se incluye de forma transitiva en su proyecto; sin embargo, las dependencias definidas en la sección dependencyManagement de other-pom-artifact-id no están incluidas en absoluto.

Así que, básicamente, los dos mecanismos diferentes se utilizan para importar/incluir los dos tipos diferentes de dependencias (dependencias gestionadas y dependencias normales).

Hay una buena página en el sitio web de maven, que puede explicar esto mucho mejor que yo, Dependency Management in Maven y también contiene información específica sobre importing dependencies.

+0

Si 'pom' A in es padre de' pom' B, ¿puede colocar B en la gestión de dependencias del proyecto A con el campo 'import'? –

+0

excelente respuesta para explicar cómo funciona, pero ¿por qué? ¿Por qué no quieres incluir las otras dependencias transitoriamente? también puedes hacer ambas cosas? importar other-pom-artifact-id y luego declarar other-pom-artifact-id como dependencia también? –

+0

Un artículo sobre DZone indica algo diferente: '... $ {} project.groupId pomlib-lib pom importación $ { project.groupId} pomlib-war w ar '[seco y flaco Guerra] (https://dzone.com/articles/dry-and-skinny-war) – coz

11

No puede tener un proyecto de tipo pom como simple dependency en otro proyecto. (Bueno, puedes - pero no hará nada útil). Solo puede haber una relación parent-child. Esto es esencialmente managing dependency through inheritance.

import margen para la dependencia pom tipo de <dependencyManagement> sección le permite alcanzar el equivalente a multiple inheritance.

Puede tener diferentes poms - cada managing un montón de dependencias relacionadas. Los proyectos que usan estos pueden import estos poms y luego especificar las dependencias que necesitan sin tener que preocuparse por la versión. Este es esencialmente el concepto bill of materials, que se ilustra en los enlaces especificados por @ DB5.

Esto ayuda a evitar que parent poms de proyectos complejos de múltiples módulos se vuelvan demasiado grandes y difíciles de manejar.

+5

¿Seguro? Pone regularmente pom (que tiene sus propias dependencias) como una dependencia regular en otro proyecto (guerra de paquetes) y obtuve todas las dependencias del proyecto pom incluidas en WEB-INF/lib del proyecto de destino. Es por eso que estoy haciendo esta pregunta :) – grafthez

+1

Gracias @Raghuram, olvidé por completo mencionar la opción padre POM al responder la pregunta. En cuanto a tener un proyecto de tipo pom como una dependencia simple, esto es posible. Como se mencionó en la pregunta original, se puede usar para [dependencias de grupo] (http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html) – DB5

+1

[ Enlace de trabajo sobre dependencias de grupo] (https://books.sonatype.com/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html#pom-relationships-sect-grouping-deps) –

4

Dos conceptos, muy similar a la orientada a objetos paradigma de programación, ayudará a responder a la pregunta:

  1. El sección DependencyManagement sólo declara las dependencias y sus detalles en el proyecto actual - el propósito es la gestión de los datos y la reutilización en otros proyectos, ya sea a través de la herencia ( padre) o de importación (alcance). Esto es como declarar un tipo de datos en el programa y ponerlo a disposición para su uso.

  2. El dependencia sección define el uso real de las dependencias en el proyecto, opcionalmente heredan los detalles (es decir, la versión, etc.) de las dependencias declaradas bajo el dependencyManagment. Es por eso que faltan dependencias si solo las pone en dependencyManagment. Esto es análogo a instanciar una instancia variable de un tipo de datos en un programa donde se necesita.

Cuestiones relacionadas