¿Por qué importa el orden de las dependencias Maven?


Pensé que el orden de las dependencias Maven no importa antes y considero esto como un pro de ella. Y estas son mis antiguas dependencias pom.xml:

<dependencies>

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.19</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.1.7.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-spring3</artifactId>
        <version>2.19</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
        <version>2.19</version>
    </dependency>

</dependencies>

Funciona bien, y hoy quiero mover la dependencia de primavera a la parte inferior para que los relacionados con jersey puedan estar juntos. Sin embargo, entonces ya no puedo hacer que funcione, mi embarcadero se queja:

[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run (default-cli) on project mtest: Execution default-cli of goal org.eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run failed: A required class was missing while executing org.eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run: org/apache/commons/logging/LogFactory

Eso es realmente confuso, así que tengo que preocuparme por el orden de las dependencias? ¿Cómo sé el orden correcto?

Author: Elderry, 2015-07-31

2 answers

El orden de las dependencias importa debido a cómo Maven resuelve las dependencias transitivas, comenzando con la versión 2.0.9. Extracto de la documentación :

(...) esto determina qué versión de una dependencia se utilizará cuando se encuentren varias versiones de un artefacto. (...) Siempre puede garantizar una versión declarándola explícitamente en el POM de su proyecto. (...) desde Maven 2.0.9 es el orden en la declaración lo que cuenta: la primera declaración gana.

 46
Author: kryger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-22 23:14:37

Para ampliar la otra respuesta (que establece que el orden de declaración afecta a la mediación de dependencias de Maven para dependencias transitivas), hay algunas herramientas que puede usar:

  • mvn dependency:tree [-Dscope=[runtime|test]] le mostrará qué dependencias estarán disponibles para el ámbito seleccionado. Ver aquí para más detalles
  • mvn dependency:build-classpath le da el orden en el que las dependencias están disponibles en su classpath (si dos o más entradas de classpath tienen la misma clase, la anterior gana). Ver aquí para detalles

No se mucho acerca de su situación, pero a menudo es el caso de que termine con la versión incorrecta de 1 o más jars en compile/runtime. Declarar su propia versión de la biblioteca en cuestión o bloquear la versión con <dependencyManagement> son opciones aquí.

Ahora para responder a su otra pregunta - ¿cómo sabe cuál es el orden correcto al declarar dependencias?

Mi sugerencia - la orden de declaración correcta es la esto le da las versiones de las dependencias que desea, en el orden que desea en . Utilice las herramientas anteriores para comprobar sus dependencias, y ajustar el orden declarado si es necesario.

Tenga en cuenta que la mayoría de los jars contienen clases con nombres inconexos, por lo que el orden exacto en el que aparecen los jars en su classpath generalmente no es tan importante. La única excepción que he notado es algunos jars en SLF4J que intencionalmente sombrean clases de las otras bibliotecas de logger que se pretende reemplazar.

 7
Author: Kyle Krull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:25:42