43 votes

Problèmes d'ordre dans le chemin de classe de Maven

Quelqu'un connaît-il un moyen de définir un ordre spécifique de classpath dans Maven2, plutôt que l'ordre aléatoire que j'ai l'impression de connaître actuellement ?

Il existe un certain nombre de raisons légitimes de vouloir le faire :

  • Un fournisseur a fourni un jar correctif, qui contient des classes surchargées pour un jar précédemment publié et, par conséquent, le jar correctif doit apparaître en premier dans l'ordre du chemin de classe.
  • Deux jar trouvés sur le classpath découvert en parcourant les dépendances pom contiennent la même classe dans le même package avec des signatures différentes. Par exemple :

j j 4.2.0.GA

org.h [ ] 3.1

contiennent tous les deux : org.hibernate.util.ReflectHelper.class, mais la version jbossall-client ne contient pas la méthode getFastClass.

En cherchant sur Google, je vois que c'est peut-être un point de désaccord entre les enthousiastes de maven et les personnes confrontées à ce problème particulier, mais il y a sûrement des raisons légitimes pour ordonner le classpath.

Tout conseil de la part de quelqu'un qui a résolu ce problème particulier serait très apprécié !

Remerciements

39voto

krosenvold Points 35979

Depuis la version 2.0.9, maven utilise l'ordre pom pour le classpath, vous pouvez donc le manipuler. Nous supprimons principalement les dépendances transitives vers des bibliothèques externes que nous incluons également directement.

Extrait des notes de version de maven 2.0.9 :

MNG-1412 / MNG-3111 a introduit un ordre déterministe des dépendances sur le chemin d'accès (classpath). Auparavant, l'ordre naturel des ensembles était utilisé, ce qui conduisait à des résultats étranges. L'ordre est maintenant préservé à partir de votre pom, avec les dépendances ajoutées par héritage ajoutées en dernier. Dans les constructions qui avaient des dépendances conflictuelles ou dupliquées, cela peut introduire un changement dans la sortie. En bref, si vous avez des problèmes étranges avec la version 2.0.9, jetez un coup d'oeil aux dépendances pour voir si vous n'avez pas de conflits quelque part.

1voto

Paul Keeble Points 577

Maven 2.0.9 ajoute l'ordre correct, vous devez donc absolument avoir cette version ou une version plus récente pour que ce qui suit fonctionne.

Deuxièmement, vous avez besoin d'un plugin mis à jour. Les gars de Maven travaillent sur un correctif, c'est dans leur jira à corriger mais c'est quelque chose dont j'avais besoin de toute urgence. Donc en attendant, j'ai corrigé cela moi-même et vous pouvez télécharger le fichier Code source du plugin modifié de github.

Edit : Refer to http://jira.codehaus.org/browse/MECLIPSE-388

Il y a deux façons de l'installer, soit en utilisant mon code modifié et en l'installant, soit en téléchargeant le jar préconstruit et en l'ajoutant.

Construire le plugin

Exécuter maven install du répertoire des plugins que vous avez consulté et ajoutez ce qui suit dans la section plugins de votre projet pom :

<build>
  </plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-eclipse-plugin</artifactId>
      <version>2.8-cpfix</version>
    </plugin>
  </plugins>
</build>

Télécharger le jar

Si vous ne souhaitez pas télécharger et compiler vous-même, vous pouvez également vous procurer le fichier fichier jar et l'installer vous-même.

Une fois que vous avez le fichier, exécutez

mvn install:install-file -Dfile=<path-to-file> -DgroupId=org.apache.maven.plugins \
    -DartifactId=maven-eclipse-plugin -Dversion=2.8-cpfix -Dpackaging=jar

Indépendamment de la manière dont vous l'avez installé, lorsque vous exécutez la commande mvn eclipse:eclipse il récupérera le code modifié et ordonnera les dépendances selon l'ordre que vous avez défini dans votre fichier pom, sans ordre alphabétique. Il placera également le conteneur JRE en tête des dépendances.

J'espère que la vraie version de ce code sortira bientôt, mais en attendant, cette solution a fonctionné pour mon projet et j'espère qu'elle pourra aider d'autres personnes.

0voto

Dave The Dane Points 18

Il s'agit plutôt d'une qualification supplémentaire de la question que d'une réponse :
sous "Maven Dependencies", Eclipse ne semble pas respecter l'ordre POM.
(il utilise l'ordre POM sous "Java Build Path" et dans le Classpath)

Est-ce le comportement attendu ?

J'utilise Eclipse 2021-09 (qui intègre Maven 3.8.1) sous Windows 10.

Voici le POM :

<project
        xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.group</groupId>
    <artifactId>arty.fact</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Maven Dependency Order</name>

    <properties>
        <maven.compiler.target>17</maven.compiler.target>
        <maven.compiler.source>17</maven.compiler.source>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
            <version>1.6.3</version>
            <exclusions><exclusion><groupId>*</groupId><artifactId>*</artifactId></exclusion></exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.14.1</version>
            <exclusions><exclusion><groupId>*</groupId><artifactId>*</artifactId></exclusion></exclusions>
        </dependency>
    </dependencies>
</project>

Les dépendances Maven ressemblent à ceci :
Maven Dependencies

0voto

kissLife Points 111

Si vous avez des difficultés à démarrer IntelliJ IDEA, vous pouvez changer l'ordre des dépendances de la structure du projet .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X