2012-01-19 17 views
19

Ho un progetto che utilizza entrambe le dipendenze in modo indipendente: BoneCP e Hibernate. Ma grazie a SLF4J e ai suoi conflitti di versione non funziona perché BoneCP richiede SLF4J 1.5 e Hibernate richiede SLF4j 1.6. Come sai, non è possibile importare due diverse versioni della stessa dipendenza nel tuo pom.xml. Quindi, cosa posso fare per risolvere questo straordinario effetto collaterale SLF4J ???Maven + SLF4J: conflitto di versione quando si utilizzano due diverse dipendenze che richiedono due diverse versioni di SLF4J

L'errore che ottengo è il famigerato:

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. 

avrei bisogno di aggiungere questo, ma stessa dipendenza con due versioni differenti non è consentito:

<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 dipendenza albero:

[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 
+0

Si prega di aggiungere l'errore che si sta ottenendo. Inoltre, non dovresti aggiungere SLF4J al tuo POM solo perché altre dipendenze lo usano: devi solo aggiungerlo se lo usi direttamente.Maven si prende cura delle dipendenze transitive e sospetto che entrerà in 1.6 e BoneCP non sarà infelice. – SingleShot

+0

Errore aggiunto. Credo di dover aggiungere un'implementazione di SLF4J. Quindi il problema è: Hibernate richiede l'implementazione 1.6. BoneCP richiede 1.5. Questo è lo scontro! – chrisapotek

risposta

28

il link fornito nel messaggio di errore, "http://www.slf4j.org/codes.html#version_mismatch", afferma:

Uno SLF4J vincolante designa un manufatto come slf4j-jdk14.jar o slf4j-log4j12.jar utilizzato per legare slf4j a un framework di registrazione sottostante , ad esempio java.util.logging o log4j. La miscelazione di diverse versioni di associazione slf4j-api.jar e SLF4J può causare problemi. Per esempio , se si utilizza slf4j-api-1.6.6.jar, allora si dovrebbe anche usare slf4j-simple-1.6.6.jar, usando slf4j-simple-1.5.5.jar non funzionerà .

NOTA Dal punto di vista del cliente tutte le versioni di slf4j-api sono compatibili. Il codice cliente compilato con slf4j-api-N.jar eseguirà perfettamente bene con slf4j-api-M.jar per qualsiasi N e M. È sufficiente che assicuri che la versione del binding corrisponda a quella dello slf4j-api .vaso. Non devi preoccuparti della versione di slf4j-api.jar utilizzata da una determinata dipendenza nel tuo progetto. Puoi usare sempre qualsiasi versione di slf4j-api.jar, e finché la versione di slf4j-api.jar e la sua corrispondenza di associazione, si dovrebbe andare bene.

Tutto ciò che serve è dichiarare una dipendenza da slf4j-log4j12 una versione di SLF4J nel proprio pom.xml. Vorrei suggerire 1.6.6 che è l'ultimo. Questo porterà la stessa versione di slf4j-api nel tuo progetto in virtù delle regole di transitività di Maven.

Quindi, basta dichiarare quanto segue nel file pom.xml.

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

Io parto dal presupposto che non si effettivamente bisogno di dichiarare slf4j-api e slf4j-log4j12 nel campo di applicazione previsto.

+12

FYI questa risposta proviene dall'autore di SLF4J. – SingleShot

4

Escludere solo la versione 1.5.10 di 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> 
+1

+1 per menzionare l'esclusione. @chrisapotek: potresti voler effettivamente escludere SLF4J da BoneCP ** e ** Hibernate, quindi aggiungere manualmente dipendenze al tuo pom sia per slf4j-api che per slf4j-simple. Questo dovrebbe sbarazzarsi definitivamente dello scontro di dipendenza. – Perception

+0

Qui qualcosa viene frainteso: BoneCP è vincolato (esigenze) 1.5. È legato all'API e NON all'implementazione che si sta tentando di escludere in precedenza. Devo INCLUDERE un'implementazione extra per BoneCP. Non riesco a CAMBIARE la versione API utilizzata da BoneCP. Controlla la dipendenza da mvn prova modificata nella domanda. – chrisapotek

0

Ho avuto lo stesso errore. In pratica, fai attenzione a disporre di più versioni di jar slf4j in classpath.

Problemi correlati