spring - tutorial - ¿Por qué el orden de las dependencias de Maven importa?
maven tutorial (2)
Pensé que el orden de las dependencias de Maven no importaba antes y lo considero como un profesional. Y estas son las dependencias de mi antiguo 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 la primavera a la parte inferior para que los relacionados con la camiseta puedan estar juntos. Sin embargo, entonces ya no puedo hacerlo funcionar, mi Jetty 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, ¿entonces tengo que preocuparme por el orden de las dependencias? ¿Cómo sé el orden correcto?
El orden de las dependencias es importante debido a cómo Maven resuelve las dependencias transitivas, comenzando con la versión 2.0.9. Extracto de la documentation :
(...) esto determina qué versión de una dependencia se usará cuando se encuentren múltiples 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 que cuenta: la primera declaración gana .
Para ampliar la otra respuesta (que establece que el orden de declaración afecta la mediación de dependencia 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 alcance seleccionado. Vea aquí para más detalles -
mvn dependency:build-classpath
le da un orden en el que las dependencias están disponibles en su classpath (si dos o más entradas classpath tienen la misma clase, la anterior gana). Vea aquí para más detalles
No sé mucho sobre tu situación, pero a menudo sucede que terminas con la versión incorrecta de 1 o más frascos en compilación / tiempo de ejecución. 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: el orden de declaración correcto es el que le proporciona las versiones de las dependencias que desea, en el orden en que las quiere . Use las herramientas de arriba para verificar sus dependencias y ajustar la orden declarada si es necesario.
Tenga en cuenta que la mayoría de los archivos jar contienen clases con nombres desarticulados, por lo que el orden exacto en el que aparecen los archivos jar en su classpath no suele ser tan importante. La única excepción que he notado son algunos jars en SLF4J que intencionalmente ocultan las clases de las otras bibliotecas de registradores que pretende reemplazar.