2012-01-19 18 views
19

Tengo un proyecto que usa ambas dependencias de forma independiente: BoneCP e Hibernate. Pero gracias a SLF4J y sus conflictos de versión, no funciona porque BoneCP requiere SLF4J 1.5 e Hibernate requiere SLF4j 1.6. Como usted sabe, no es posible importar dos versiones diferentes de la misma dependencia en su pom.xml. Entonces, ¿qué puedo hacer para solucionar este sorprendente efecto secundario de SLF4J?Maven + SLF4J: Conflicto de versión cuando se usan dos dependencias diferentes que requieren dos versiones diferentes de SLF4J

El error que consigo es el 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. 

que tendría que añadir esto, pero no está permitido misma dependencia con dos versiones diferentes:

<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 árbol de dependencias:

[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

Agregue el error que está recibiendo. Además, no debería agregar SLF4J a su POM solo porque otras dependencias lo usan, solo necesita agregarlo si _you_ lo usa directamente.Maven se ocupa de las dependencias transitivas y sospecho que sacará 1.6 y BoneCP no estará descontento. – SingleShot

+0

Error agregado. Creo que DEBO agregar una implementación de SLF4J. Entonces el problema es: Hibernate requiere 1.6 implementación. BoneCP requiere 1.5. ¡Ese es el choque! – chrisapotek

Respuesta

28

El enlace proporcionado en el mensaje de error, "http://www.slf4j.org/codes.html#version_mismatch", afirma:

Un SLF4J unión designa un artefacto tal como slf4j-jdk14.jar o slf4j-log4j12.jar utiliza para enlazar slf4j a un marco de registro subyacente , por ejemplo, java.util.logging o log4j. La mezcla de diferentes versiones de de slf4j-api.jar y SLF4J vinculante puede causar problemas. Para el ejemplo , si está utilizando slf4j-api-1.6.6.jar, también debe usarslf4j-simple-1.6.6.jar, con slf4j-simple-1.5.5.jar no funcionará .

NOTA Desde la perspectiva del cliente todas las versiones de slf4j-api son compatible. El código de cliente compilado con slf4j-api-N.jar ejecutará perfectamente bien con slf4j-api-M.jar para cualquier N y M. Solo necesita asegúrese de que la versión de su enlace coincida con la del slf4j-api .tarro. No tiene que preocuparse por la versión de slf4j-api.jar utilizada por una dependencia dada en su proyecto. Puede usar siempre cualquier versión de slf4j-api.jar, y siempre que la versión de slf4j-api.jar y su enlace coincida, debería estar bien.

Todo lo que necesita es declarar una dependencia de slf4j-log4j12 alguna versión de SLF4J en su pom.xml. Sugeriría 1.6.6 que es el último. Esto extraerá la misma versión de slf4j-api en su proyecto en virtud de las reglas de transitividad de Maven.

Por lo tanto, solo declare lo siguiente en su archivo pom.xml.

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

Estoy asumiendo que en realidad no necesita declarar slf4j-api y slf4j-log4j12 en el ámbito de aplicación previsto.

+12

FYI esta respuesta es del autor de SLF4J. – SingleShot

4

Solo excluya la versión 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> 
+1

+1 por mencionar la exclusión. @chrisapotek: es posible que desee excluir SLF4J de BoneCP ** y ** Hibernate, luego agregue manualmente dependencias a su pom para slf4j-api y slf4j-simple. Eso debería deshacerse del choque de dependencia para siempre. – Perception

+0

Algo se entiende mal aquí: BoneCP está obligado (necesita) 1.5. Está vinculado a la API y NO a la implementación que está tratando de excluir arriba. Necesito INCLUIR una implementación adicional para BoneCP. No puedo CAMBIAR la versión de API utilizada por BoneCP. Verifique la dependencia mvn intente editado en la pregunta. – chrisapotek

0

Tuve el mismo error. Básicamente, tenga cuidado de tener múltiples versiones de slf4j jar en classpath.

Cuestiones relacionadas