provided plugin example ejemplo dependency dependencies version maven-3 transitive-dependency

dependencies - plugin - ¿Cómo resuelve Maven los conflictos de versión de las dependencias transitivas? estrategia de victorias más cercanas



maven-dependency-plugin (2)

Finalmente me acostumbré a no tener ninguna dependencia declarada no declarada o no utilizada en mis proyectos. Aunque es muy difícil hacer un seguimiento de las dependencias de tiempo de ejecución / prueba declaradas no utilizadas que se enumeran en la dependencia: analizar ... Uno solo debe escribir comentarios a ellos en pom.xml o administrarlos para saber que son necesarios para las pruebas o el tiempo de ejecución.

Pero la forma de resolver el conflicto de versiones aún no está clara para mí. Respecto a las dependencias transitivas.

¿Cómo funciona exactamente la estrategia de ganancias más cercanas? ¿Cuándo se usa una versión sobre otra versión?

  • Si declara la dependencia Usada no declarada con un número de versión, siempre gana

  • Si uno no especifica la versión de dependencia explícitamente, Maven no puede resolver ningún conflicto de versión que pueda surgir con respecto a esta dependencia (extraño, pero escrito here )

  • Si no declara la dependencia usada no declarada, elige una dependencia transitiva del nivel más cercano (estrategia de ganancias más cercanas) y si el conflicto está en el mismo nivel, de alguna manera decide entre la versión A sobre la versión B ... Tal vez la primera Una a la que llega al procesar las dependencias gana.


Creo que la resolución de dependencia funciona de la misma manera que describiste.

También creo que tu vida sería mucho más fácil si utilizas la etiqueta secundaria <scope> para tu <dependency>

Como se cita en el sitio web oficial de Maven:

  1. compilar: este es el alcance predeterminado, utilizado si no se especifica ninguno. Las dependencias de compilación están disponibles en todos los classpaths de un proyecto. Además, esas dependencias se propagan a proyectos dependientes.
  2. proporcionado: Esto es muy parecido a la compilación, pero indica que espera que el JDK o un contenedor proporcione la dependencia en el tiempo de ejecución. Por ejemplo, al crear una aplicación web para Java Enterprise Edition, establecería la dependencia de la API de Servlet y las API de Java EE relacionadas en el alcance proporcionado porque el contenedor web proporciona esas clases. Este alcance solo está disponible en la compilación y prueba classpath, y no es transitivo.
  3. tiempo de ejecución Este alcance indica que la dependencia no es necesaria para la compilación, pero es para la ejecución. Se encuentra en el entorno de ejecución y en la prueba de las rutas de clase, pero no en la compilación de la ruta de clases.
  4. prueba: este alcance indica que la dependencia no es necesaria para el uso normal de la aplicación y solo está disponible para las fases de compilación y ejecución de la prueba.
  5. sistema: este ámbito es similar al proporcionado, excepto que debe proporcionar el JAR que lo contiene explícitamente. El artefacto siempre está disponible y no se busca en un repositorio.
  6. importación: (solo disponible en Maven 2.0.9 o posterior) Este ámbito solo se usa en una dependencia de tipo pom en la sección. Indica que el POM especificado debe reemplazarse con las dependencias en la sección de ese POM. Dado que se reemplazan, las dependencias con un alcance de importación no participan realmente en la limitación de la transitividad de una dependencia.

Hay algunos enlaces a documentación de gestión de dependencias:

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html (tabla importend en la sección "alcance de la dependencia")

Hay un artículo de dios en una revista alemana que describe la resolución de dependencias; aquí está la referencia del artículo: http://www.bibsonomy.org/bibtex/2ef10bb1bc1be7806bc3fba53417bbd5f/funthomas424242

Hay una sección sobre el complemento de dependencia en el libro de sonatype en: here

Espero que haya sido útil.