it-swarm.com.de

Maven + SLF4J: Versionskonflikt bei Verwendung zweier unterschiedlicher Abhängigkeiten, für die zwei verschiedene SLF4J-Versionen erforderlich sind

Ich habe ein Projekt, das beide Abhängigkeiten unabhängig voneinander verwendet: BoneCP und Hibernate. Dank SLF4J und seinen Versionskonflikten funktioniert es jedoch nicht, da BoneCP SLF4J 1.5 und Hibernate SLF4j 1.6 erfordert. Wie Sie wissen, ist es nicht möglich, zwei verschiedene Versionen derselben Abhängigkeit in Ihrer pom.xml zu verwenden. Was kann ich also tun, um diesen erstaunlichen SLF4J-Nebeneffekt zu umgehen?

Der Fehler, den ich bekomme, ist der Infame: 

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.

Ich würde dies hinzufügen müssen, aber dieselbe Abhängigkeit mit zwei verschiedenen Versionen ist nicht zulässig:

<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>   

Maven-Abhängigkeitsbaum:

[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

Der in der Fehlermeldung angegebene Link " http://www.slf4j.org/codes.html#version_mismatch " besagt: 

Eine SLF4J-Bindung bezeichnet ein Artefakt wie slf4j-jdk14.jar oder slf4j-log4j12.jar wird verwendet, um slf4j an eine zugrunde liegende Protokollierung zu binden Framework, beispielsweise Java.util.logging oder log4j. Mischen Mischen anders Versionen von slf4j-api.jar und SLF4J-Bindung können Probleme verursachen. Zum Wenn Sie beispielsweise slf4j-api-1.6.6.jar verwenden, sollten Sie auch Verwenden Sie slf4j-simple-1.6.6.jar, mit slf4j-simple-1.5.5.jar wird nicht Arbeit.

HINWEIS Aus Sicht des Kunden sind alle Versionen von slf4j-api kompatibel. Clientcode, der mit slf4j-api-N.jar kompiliert wurde, wird ausgeführt perfekt mit slf4j-api-M.jar für jedes N und M. Sie müssen nur Stellen Sie sicher, dass die Version Ihrer Bindung mit der von .__ übereinstimmt. slf4j-api.jar. Sie müssen sich nicht um die Version von .__ kümmern. slf4j-api.jar wird von einer bestimmten Abhängigkeit in Ihrem Projekt verwendet. Sie können Verwenden Sie immer eine beliebige Version von slf4j-api.jar und die Version von slf4j-api.jar und die verbindliche Übereinstimmung, sollten Sie in Ordnung sein.

In Anbetracht dessen, dass alle Versionen von slf4j-api aus Sicht des Kunden austauschbar sind, können in dem Szenario, in dem verschiedene Versionen von slf4j-api und dessen Bindung, z. slf4j-log4j12 werden eingezogen und deklarieren sie explizit als Abhängigkeiten in Ihrem POM wie folgt:

<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>   

Hier gehe ich davon aus, dass Sie slf4j-api und slf4j-log4j12 im vorgesehenen Umfang nicht wirklich deklarieren müssen. 

Siehe auch Einführung in den Abhängigkeitsmechanismus die besagt: 

Abhängigkeitsvermittlung - Dies bestimmt, welche Version einer Abhängigkeit wird verwendet, wenn mehrere Versionen eines Artefakts angetroffen werden . Derzeit unterstützt Maven 2.0 nur die Verwendung der "next definition" was bedeutet, dass es die Version der nächsten Abhängigkeit von .__ verwendet. Ihr Projekt in der Baumstruktur der Abhängigkeiten. Sie können immer eine .__ garantieren. Version, indem Sie sie explizit im POM Ihres Projekts angeben.

30
Ceki

Schließen Sie einfach die 1.5.10-Version von SLF4J aus

 <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

Ich hatte den gleichen Fehler. Beachten Sie grundsätzlich, dass mehrere Versionen von slf4j-Gläsern im Klassenpfad vorhanden sind.

0
Binita Bharati