Diferencias entre la gestión de dependencias y las dependencias en Maven

¿Cuál es la diferencia entre dependencyManagement y dependencies ? He visto los documentos en el sitio web de Apache Maven. Parece que una dependencia definida en dependencyManagement se puede utilizar en sus módulos secundarios sin especificar la versión.

Por ejemplo:

Un proyecto principal (Pro-par) define una dependencia bajo la dependencyManagement :

    junit junit 3.8    

Luego, en el hijo de Pro-par, puedo usar el junit:

    junit junit   

Sin embargo, me pregunto si es necesario definir junit en el pom padre ¿Por qué no definirlo directamente en el módulo necesario?

Dependency Management permite consolidar y centralizar la administración de versiones de dependencia sin agregar dependencias heredadas por todos los elementos secundarios. Esto es especialmente útil cuando tiene un conjunto de proyectos (es decir, más de uno) que hereda un elemento primario común.

Otro caso de uso extremadamente importante de la gestión de dependencyManagement es el control de versiones de artefactos utilizados en dependencias transitivas. Esto es difícil de explicar sin un ejemplo. Afortunadamente, esto se ilustra en la documentación.

Llego tarde a esta pregunta, pero creo que vale una respuesta más clara que la aceptada (lo cual es correcto, pero no enfatiza la parte realmente importante, que debe deducirse a sí mismo).

En el POM padre, la principal diferencia entre las y es la siguiente:

Los artefactos especificados en la sección SIEMPRE se incluirán como una dependencia de los módulos secundarios.

Los artefactos especificados en la sección solo se incluirán en el módulo secundario si también se especificaron en la sección del módulo secundario. ¿Por qué es bueno que preguntes? porque especifica la versión y / o el scope en el elemento primario, y puede omitirlos al especificar las dependencias en el POM secundario. Esto puede ayudarlo a usar versiones unificadas para dependencias para módulos secundarios, sin especificar la versión en cada módulo secundario.

Es como dijiste; dependencyManagement se utiliza para extraer toda la información de dependencia en un archivo POM común, simplificando las referencias en el archivo POM secundario.

Se vuelve útil cuando tiene múltiples atributos que no quiere volver a escribir en varios proyectos secundarios.

Finalmente, dependencyManagement se puede usar para definir una versión estándar de un artefacto para usar en múltiples proyectos.

La documentación en el sitio de Maven es horrible. Lo que hace dependencyManagement es simplemente mover sus definiciones de dependencia (versión, exclusiones, etc.) al pom padre, luego en las poms secundarias solo tiene que poner groupId y artifactId. Eso es todo (excepto para el pomcate de padres y cosas por el estilo, pero tampoco es realmente complicado – dependencyManagement gana sobre las dependencias en el nivel principal – pero si tiene una pregunta sobre eso o importa, la documentación de Maven es un poco mejor).

Después de leer toda la basura ‘a’, ‘b’, ‘c’ en el sitio de Maven y confundirme, volví a escribir su ejemplo. Entonces, si tuviera 2 proyectos (proj1 y proj2) que compartan una dependencia común (betaShared), podría mover esa dependencia al pom padre. Mientras lo hace, también puede mover cualquier otra dependencia (alfa y charlie), pero solo si tiene sentido para su proyecto. Entonces, para la situación descrita en las oraciones anteriores, aquí está la solución con dependencyManagement en el pom padre:

       alpha alpha 1.0   zebra zebra     charlie  charlie 1.0 war runtime    betaShared betaShared 1.0 bar runtime         alpha alpha    betaShared betaShared bar         charlie charlie war    betaShared betaShared bar     

Todavía hay una cosa que no se destaca lo suficiente, en mi opinión, y que es herencia no deseada .

Aquí hay un ejemplo incremental:

Declaro en mi parent pom:

   com.google.guava guava 19.0   

¡auge! Lo tengo en mis módulos Child A , Child B y Child C :

  • Implicidad heredada por poms de niño
  • Un solo lugar para administrar
  • No hay necesidad de redeclarar nada en poms de niños
  • Todavía puedo volver a cuidar y reemplazar a la version 18.0 en un Child B si quiero.

Pero, ¿qué pasa si termino no necesitando guayaba en Child C , y tampoco en los futuros módulos Child D y Child E ?

¡Aún lo heredarán y esto no es deseado! Esto es exactamente como el código del objeto Java God, donde heredas algunas partes útiles de una clase, y un montón de cosas no deseadas también.

Aquí es donde entra en juego . Cuando agrega esto a su pom padre, todos sus módulos secundarios DEJAN de verlo . Y por lo tanto, está obligado a entrar en cada módulo individual que LO NECESITA y declararlo nuevamente ( Child A y Child B , sin la versión).

Y, obviamente, no lo hace para Child C , y por lo tanto su módulo sigue siendo delgado.

Si la dependencia se definió en el elemento de dependenciaManagement de pom del nivel superior, el proyecto secundario no tenía que enumerar explícitamente la versión de la dependencia. si el proyecto hijo definió una versión, anularía la versión enumerada en la sección de gestión de dependencias del POM de nivel superior. Es decir, la versión de dependencyManagement solo se usa cuando el hijo no declara una versión directamente.

Hay algunas respuestas que describen las diferencias entre las y con maven.

Sin embargo, pocos puntos se detallan a continuación de manera concisa:

  1. permite consolidar todas las dependencias (utilizadas en el nivel de pom del hijo) utilizadas en diferentes módulos: claridad , gestión de versiones de dependencia central
  2. permite actualizar / degradar fácilmente las dependencias en función de las necesidades, en otros casos, esto debe ejercerse en todos los niveles de pom de los niños – consistencia
  3. las dependencias proporcionadas en la etiqueta siempre se importan, mientras que las dependencias provistas en en parent pom se importarán solo si child pom tiene la entrada correspondiente en su etiqueta .

En el POM padre, la principal diferencia entre las y es la siguiente:

Los artefactos especificados en la sección SIEMPRE se incluirán como una dependencia de los módulos secundarios.

Los artefactos especificados en la sección solo se incluirán en el módulo secundario si también se especificaron en la sección del módulo hijo. ¿Por qué es bueno que preguntes? porque especifica la versión y / o el scope en el elemento primario, y puede omitirlos al especificar las dependencias en el POM secundario. Esto puede ayudarlo a usar versiones unificadas para dependencias para módulos secundarios, sin especificar la versión en cada módulo secundario.

En Eclipse, hay una característica más en la dependencyManagement . Cuando las dependencies se utilizan sin él, las dependencias no encontradas se notan en el archivo pom. Si se usa dependencyManagement , las dependencias sin resolver permanecen desapercibidas en el archivo pom y los errores aparecen solo en los archivos java. (importaciones y tal …)