Pourquoi l'ordre des dépendances Maven importe?

Je pensais que l'ordre des dépendances Maven n'a pas d'importance avant et considère cela comme un pro de celui-ci. Et ce sont mes anciennes dépendances de 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>

Cela fonctionne bien, et aujourd'hui, je veux déplacer la dépendance au printemps vers le bas pour que ceux liés au maillot puissent être ensemble. Cependant, je ne peux plus le faire fonctionner, ma jetée se plaint:

[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

C'est vraiment déroutant, alors dois-je me préoccuper de l'ordre des dépendances? Comment puis-je connaître l'ordre correct?

26
demandé sur Elderry 2015-07-31 10:45:25

2 réponses

L'ordre des dépendances importe en raison de la façon dont Maven résout les dépendances transitives, à partir de la version 2.0.9. Extrait de la documentation :

(...) cela détermine quelle version d'une dépendance sera utilisée lorsque plusieurs versions d'un artefact sont rencontrées. (...) Vous pouvez toujours garantir une version en la déclarant explicitement dans le POM de votre projet. (...) depuis Maven 2.0.9 c'est l'ordre dans la déclaration qui compte: le premier déclaration gagne.

46
répondu kryger 2016-03-22 23:14:37

Pour développer l'autre réponse (qui indique que l'ordre de déclaration affecte la médiation de dépendance de Maven pour les dépendances transitives), il y a quelques outils que vous pouvez utiliser:

  • mvn dependency:tree [-Dscope=[runtime|test]] vous montrera quelles dépendances seront disponibles pour la portée sélectionnée. Voir ici pour plus de détails
  • mvn dependency:build-classpath vous donne l'ordre dans lequel les dépendances sont disponibles sur votre classpath (si deux ou plusieurs entrées classpath ont la même classe,la première gagne). voir ici pour détails

Je ne sais pas grand-chose sur votre situation, mais il est souvent le cas que vous vous retrouvez avec la mauvaise version de 1 ou plusieurs jars à la compilation/exécution. déclarer votre propre version de la bibliothèque en question ou verrouiller la version avec <dependencyManagement> sont des options ici.

Maintenant, pour répondre à votre autre question - Comment savez-vous quel est le bon ordre lors de la déclaration des dépendances?

MA suggestion - le bon ordre de déclaration est celui que vous obtient les versions des dépendances que vous voulez, dans l'ordre que vous voulez dans. Utilisez les outils ci - dessus pour vérifier vos dépendances et modifier l'ordre déclaré si nécessaire.

Notez que la plupart des jars contiennent des classes nommées de manière disjointe, donc l'ordre exact dans lequel les jars apparaissent sur votre classpath n'est généralement pas si important. La seule exception que j'ai remarquée est certains pots dans SLF4J {[8] } qui masquent intentionnellement les classes des autres bibliothèques de logger auxquelles il est destiné remplacer.

7
répondu Kyle Krull 2017-05-23 12:25:42