java - org - slf4j-log4j12 maven
Maven+SLF4J: conflicto de versiones al usar dos dependencias diferentes que requieren dos versiones diferentes de SLF4J (3)
Tengo un proyecto que utiliza 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 y Hibernate requiere SLF4j 1.6. Como saben, no es posible importar dos versiones diferentes de la misma dependencia en su pom.xml. Entonces, ¿qué puedo hacer para solucionar este increíble efecto secundario de SLF4J?
El error que recibo 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.
Necesitaría agregar esto, pero no se permite la 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>
Árbol de dependencia de 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
El enlace proporcionado en el mensaje de error, " http://www.slf4j.org/codes.html#version_mismatch ", establece:
Un enlace SLF4J designa un artefacto como slf4j-jdk14.jar o slf4j-log4j12.jar utilizado para enlazar slf4j a un marco de registro subyacente, por ejemplo, java.util.logging o log4j. Mezclar diferentes versiones de slf4j-api.jar y SLF4J puede causar problemas. Por ejemplo, si está usando slf4j-api-1.6.6.jar, entonces también debe usar slf4j-simple-1.6.6.jar, usar slf4j-simple-1.5.5.jar no funcionará.
NOTA Desde la perspectiva del cliente, todas las versiones de slf4j-api son compatibles . El código del cliente compilado con slf4j-api-N.jar funcionará perfectamente bien con slf4j-api-M.jar para cualquier N y M. Solo necesita asegurarse de que la versión de su enlace coincida con la de slf4j-api.jar. No tiene que preocuparse por la versión de slf4j-api.jar utilizada por una dependencia determinada en su proyecto. Siempre puedes usar CUALQUIER versión de slf4j-api.jar, y siempre y cuando la versión de slf4j-api.jar y su enlace coincida, deberías estar bien.
Dado que todas las versiones de slf4j-api son intercambiables desde la perspectiva de los clientes, en el escenario donde se incorporan diferentes versiones de slf4j-api y su vinculación, por ejemplo, slf4j-log4j12, declare explícitamente como dependencias en su POM como sigue:
<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>
Aquí estoy asumiendo que no es necesario declarar slf4j-api y slf4j-log4j12 en el alcance proporcionado.
Ver también Introducción al Mecanismo de Dependencia que establece:
Mediación de dependencia: esto determina qué versión de una dependencia se usará cuando se encuentren múltiples versiones de un artefacto. Actualmente, Maven 2.0 solo admite el uso de la " definición más cercana ", lo que significa que usará la versión de la dependencia más cercana a su proyecto en el árbol de dependencias. Siempre puede garantizar una versión declarándola explícitamente en el POM de su proyecto.
Solo excluye 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>
Tuve el mismo error. Básicamente, ten cuidado de tener varias versiones de los tarros slf4j en classpath.