2010-08-19 18 views
108

Estoy construyendo una pequeña aplicación Java y esperando usar logback para el registro.Incompatibilidad con el marco de registro

Mi aplicación tiene una dependencia en un proyecto mayor que hace su registro a través de

org.apache.commons | com.springsource.org.apache.commons.logging | 1.1.1 

... así que mi plan era utilizar

org.slf4j | jcl-over-slf4j | 1.5.6 

... para redirigir el registro en JCL

org.slf4j | slf4j-api | 1.6.0 

... y en última instancia a

ch.qos.logback | logback-classic | 0.9.22 
ch.qos.logback | logback-core | 0.9.22 

por lo que mi aplicación puede iniciar sesión mediante logback a través de su API slf4j, mientras que el código de la biblioteca anterior puede iniciar sesión en la misma ubicación a través de la redirección.

Por desgracia, esto se traduce en

java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V 
at org.apache.commons.logging.impl.SLF4JLocationAwareLog.info(SLF4JLocationAwareLog.java:141) 

He intentado números verision superiores e inferiores en algunos de estos frascos y cavar a través de documentación de la API y tal ... pero soy incapaz de encontrar y resolver el problema.

Ayuda, por favor?

Aunque logback se considera el marco de registro "estratégico", tengo un margen de maniobra en el mecanismo de registro que finalmente uso. Sin embargo, espero usar logback o log4j, y definitivamente quiero fusionar el inicio de sesión del proyecto anterior en lo que sea que termine siendo el "nuevo" marco de registro, a través de una configuración común.

Respuesta

110

Está mezclando la versión 1.5.6 del puente jcl con la versión 1.6.0 del slf4j-api; esto no funcionará debido a algunos cambios en 1.6.0. Utilice las mismas versiones para ambos, es decir, 1.6.1 (la última). Uso el puente jcl-over-slf4j todo el tiempo y funciona bien.

+2

Eso funcionó de inmediato, por supuesto; ¡muchas gracias! No había usado 1.6.1 de esos frascos porque no parecían estar disponibles. Estoy muy molesto con m2eclipse, que pretende mostrarme todas las versiones disponibles pero misteriosamente deja caer un número significativo de ellas. –

+1

Solo por interés de alguien más a continuación: terminé con una flecha roja en el gráfico de dependencia porque incluso el último logback-core insiste en slf4j-1.6.0. Se necesitaron más bromas con versiones hasta que desaparecieron todas las flechas rojas, pero ahora ambas funcionan y todas las flechas azules. –

+1

¿Cómo exactamente eso hago? – user1721803

23

sólo para ayudar a las personas en una situación similar a mí mismo ...

Esto puede ser causada cuando una biblioteca dependiente ha incluido accidentalmente una versión antigua de slf4j. En mi caso, fue tika-0.8. Consulte https://issues.apache.org/jira/browse/TIKA-556

La solución alternativa es excluir el componente y luego depender manualmente de la versión correcta o parchada.

EG.

<dependency> 
     <groupId>org.apache.tika</groupId> 
     <artifactId>tika-parsers</artifactId> 
     <version>0.8</version> 
     <exclusions> 
      <exclusion> 
       <!-- NOTE: Version 4.2 has bundled slf4j --> 
       <groupId>edu.ucar</groupId> 
       <artifactId>netcdf</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <!-- Patched version 4.2-min does not bundle slf4j --> 
     <groupId>edu.ucar</groupId> 
     <artifactId>netcdf</artifactId> 
     <version>4.2-min</version> 
    </dependency> 
+0

Gracias! ¡Me golpeó esto al tratar de usar Jackrabbit 2.2.5 con SLF4J 1.6.1 y Logback 0.9.28! –

+0

Gracias. Me he vinculado a su respuesta aquí: http://spring-java-ee.blogspot.com/2011/04/using-jackrabbit-jcr-225-with-slf4j-161.html –

41

SLF4J 1.5.11 y 1.6.0 versiones no son compatibles (ver compatibility report), porque la lista de argumentos de org.slf4j.spi.LocationAwareLogger.log método ha sido cambiado (añadido Object [] p5):

SLF4J 1.5.11:

LocationAwareLogger.log (org.slf4j.Marker p1, String p2, int p3, 
          String p4, Throwable p5) 

SLF4J 1.6.0:

LocationAwareLogger.log (org.slf4j.Marker p1, String p2, int p3, 
          String p4, Object[] p5, Throwable p6) 

informes de compatibilidad Ver fO r otras versiones SLF4J on this page.

Puede generar dichos informes con la herramienta japi-compliance-checker.

enter image description here

Cuestiones relacionadas