web-dev-qa-db-fra.com

Maven + SLF4J: Conflit de version lors de l'utilisation de deux dépendances différentes nécessitant deux versions différentes de SLF4J

J'ai un projet qui utilise les deux dépendances indépendamment: BoneCP et Hibernate. Mais grâce à SLF4J et à ses conflits de version, cela ne fonctionne pas car BoneCP nécessite SLF4J 1.5 et Hibernate requiert SLF4j 1.6. Comme vous le savez, il n'est pas possible d'importer deux versions différentes de la même dépendance dans votre pom.xml. Alors, que puis-je faire pour contourner cet effet secondaire incroyable de SLF4J ???

L'erreur que je reçois est la fameuse: 

SLF4J: The requested version 1.5.10 by your slf4j binding is not compatible with [1.6]
SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details.

J'aurais besoin d'ajouter ceci, mais une même dépendance avec deux versions différentes n'est pas autorisée:

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.10</version>
<scope>provided</scope>
</dependency>   

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.2</version>
<scope>provided</scope>
</dependency>   

Arbre de dépendance Maven:

[INFO] [dependency:tree {execution: default-cli}]
[INFO] org.mentawai:menta:war:1.0.5-SNAPSHOT
[INFO] +- javax.servlet.jsp:jsp-api:jar:2.0:provided
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided
[INFO] +- javax.activation:activation:jar:1.1:compile
[INFO] +- javax.mail:mail:jar:1.4:compile
[INFO] +- javax.persistence:persistence-api:jar:1.0:compile
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.5.10:compile
[INFO] |  +- org.slf4j:slf4j-api:jar:1.5.10:compile
[INFO] |  \- log4j:log4j:jar:1.2.14:compile
[INFO] +- org.hibernate:hibernate-core:jar:3.6.7.Final:compile
[INFO] |  +- antlr:antlr:jar:2.7.6:compile
[INFO] |  +- commons-collections:commons-collections:jar:3.1:compile
[INFO] |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile
[INFO] |  +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.1.Final:compile
[INFO] |  \- javax.transaction:jta:jar:1.1:compile
[INFO] +- javassist:javassist:jar:3.12.1.GA:compile
[INFO] +- junit:junit:jar:4.8.1:test
[INFO] +- c3p0:c3p0:jar:0.9.1.2:compile
[INFO] +- com.h2database:h2:jar:1.2.138:compile
[INFO] +- mysql:mysql-connector-Java:jar:5.1.13:compile
[INFO] +- me.soliveirajr:mentawai:jar:2.3.3-SNAPSHOT:compile
[INFO] |  +- net.sf.json-lib:json-lib:jar:jdk15:2.3:compile
[INFO] |  |  +- commons-beanutils:commons-beanutils:jar:1.8.0:compile
[INFO] |  |  +- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] |  |  \- net.sf.ezmorph:ezmorph:jar:1.0.6:compile
[INFO] |  +- org.jdom:jdom:jar:1.1:compile
[INFO] |  +- com.thoughtworks.xstream:xstream:jar:1.3.1:compile
[INFO] |  |  \- xpp3:xpp3_min:jar:1.1.4c:compile
[INFO] |  +- org.ajaxtags:ajaxtags:jar:1.2-beta3:compile
[INFO] |  |  +- javax.servlet:jstl:jar:1.0.6:compile
[INFO] |  |  +- taglibs:standard:jar:1.0.6:compile
[INFO] |  |  \- net.htmlparser:jericho-html:jar:2.1:compile
[INFO] |  +- jgroups:jgroups-all:jar:2.2.9.1:compile
[INFO] |  +- me.soliveirajr:menta-container:jar:0.9.8:compile
[INFO] |  +- me.soliveirajr:menta-bean:jar:1.1.1:compile
[INFO] |  +- me.soliveirajr:menta-regex:jar:0.9.5:compile
[INFO] |  +- org.beanshell:bsh:jar:2.0b4:compile
[INFO] |  +- com.jolbox:bonecp:jar:0.7.1.RELEASE:compile
[INFO] |  |  \- com.google.guava:guava:jar:r08:compile
[INFO] |  +- velocity:velocity-dep:jar:1.4:compile
[INFO] |  +- commons-fileupload:commons-fileupload:jar:1.2.2:compile
[INFO] |  +- commons-io:commons-io:jar:1.3.2:compile
[INFO] |  +- net.tanesha.recaptcha4j:recaptcha4j:jar:0.0.7:compile
[INFO] |  \- commons-dbcp:commons-dbcp:jar:1.4:compile
[INFO] |     \- commons-pool:commons-pool:jar:1.5.4:compile
[INFO] +- commons-lang:commons-lang:jar:2.5:compile
[INFO] \- asm:asm:jar:3.2:compile
21
chrisapotek

Le lien fourni dans le message d'erreur " http://www.slf4j.org/codes.html#version_mismatch " indique: 

Une liaison SLF4J désigne un artefact tel que slf4j-jdk14.jar ou slf4j-log4j12.jar utilisé pour lier slf4j à une journalisation sous-jacente cadre, disons, Java.util.logging ou log4j. Mélange Mélange différent Les versions de slf4j-api.jar et de SLF4J peuvent poser problème. Pour Par exemple, si vous utilisez slf4j-api-1.6.6.jar, alors vous devriez également utilisez slf4j-simple-1.6.6.jar, utiliser slf4j-simple-1.5.5.jar ne le fera pas travail.

NOTE Du point de vue du client, toutes les versions de slf4j-api sont compatible. Le code client compilé avec slf4j-api-N.jar s'exécutera parfaitement bien avec slf4j-api-M.jar pour tout N et M. Il vous suffit de assurez-vous que la version de votre liaison correspond à celle de slf4j-api.jar. Vous n'avez pas à vous soucier de la version de slf4j-api.jar utilisé par une dépendance donnée dans votre projet. Vous pouvez utilisez toujours TOUTE version de slf4j-api.jar, et aussi longtemps que la version de slf4j-api.jar et sa correspondance, ça devrait aller.

Etant donné que toutes les versions de slf4j-api sont interchangeables du point de vue des clients, dans le cas où différentes versions de slf4j-api et sa liaison, par exemple slf4j-log4j12 sont insérés, déclarez-les explicitement comme des dépendances dans votre POM comme suit:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.25</version>
</dependency>   

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.25</version>
</dependency>   

Je suppose ici que vous n'avez pas réellement besoin de déclarer slf4j-api et slf4j-log4j12 dans la portée fournie. 

Voir aussi Introduction au mécanisme de dépendance qui dit: 

Médiation de dépendance - détermine la version d’une dépendance sera utilisé lorsque plusieurs versions d'un artefact sont rencontrées . Actuellement, Maven 2.0 ne prend en charge que l’utilisation de "définition la plus proche" ce qui signifie qu'il utilisera la version de la dépendance la plus proche de votre projet dans l'arborescence des dépendances. Vous pouvez toujours garantir un version en le déclarant explicitement dans le POM de votre projet.

30
Ceki

Exclure juste la version 1.5.10 de SLF4J

 <dependency>
      <groupId>...</groupId>
      <artifactId>BoneCP</artifactId>
      <version>...</version>
      <exclusions>
        <exclusion>  <!-- declare the exclusion here -->
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-log4j12</artifactId>
         <version>1.5.10</version>
        </exclusion>
      </exclusions> 
    </dependency>
5
e-zinc

J'ai eu la même erreur. En gros, méfiez-vous des versions multiples des fichiers jar slf4j dans classpath.

0
Binita Bharati