web-dev-qa-db-fra.com

Pourquoi l'ordre des dépendances Maven est-il important?

Je pensais que l'ordre des dépendances Maven n'avait pas d'importance auparavant et considérait cela comme un pro. Et voici les 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 du printemps vers le bas afin que ces maillots liés 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 connaître la bonne commande?

48
Elderry

L'ordre des dépendances le fait 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 de la déclaration qui compte: la première déclaration gagne .

74
kryger

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 existe 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 chemin de classe (si deux ou plusieurs entrées de chemin de classe ont la même classe, la précédente l'emporte). Voir ici pour plus de détails

Je ne connais pas grand-chose à votre situation, mais il arrive souvent que vous vous retrouviez avec la mauvaise version de 1 ou plusieurs bocaux lors de la compilation/exécution. Déclaration de votre propre version de la bibliothèque en question ou verrouillage de 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 qui vous obtient les versions des dépendances que vous voulez, dans l'ordre dans lequel vous les voulez . Utilisez les outils ci-dessus pour vérifier vos dépendances et ajustez l'ordre déclaré si nécessaire.

Notez que la plupart des fichiers JAR contiennent des classes nommées de manière disjointe, donc l'ordre exact dans lequel les fichiers JAR apparaissent sur votre chemin de classe n'est généralement pas si important. La seule exception que j'ai remarquée est certains pots dans SLF4J qui intentionnellement masquent les classes des autres bibliothèques d'enregistreurs qu'il est destiné à remplacer.

16
Kyle Krull