2010-08-19 20 views
108

Sto costruendo una piccola app Java e spero di utilizzare il logback per la registrazione.incompatibilità della struttura di registrazione

mia app ha una dipendenza su un progetto vecchio che fa il suo registrazione tramite

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

... quindi il mio piano era di usare

org.slf4j | jcl-over-slf4j | 1.5.6 

... per reindirizzare il JCL per la registrazione

org.slf4j | slf4j-api | 1.6.0 

... e in definitiva a

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

così la mia applicazione può accedere attraverso logback attraverso la sua API slf4j mentre il vecchio codice della libreria può accedere nella stessa posizione tramite il reindirizzamento.

Ahimè, questo si traduce in

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) 

Ho provato numeri verision superiori e inferiori su alcuni di questi vasi e anche scavando attraverso documentazione delle API e tale ... ma sono in grado di trovare e risolvere il problema.

Aiuto, per favore?

Anche se logback è considerato il quadro di registrazione "strategica", ho qualche margine di manovra in cui meccanismo di registrazione che in ultima analisi, lo uso. Spero di poter utilizzare logback o log4j, tuttavia, e voglio assolutamente unire la registrazione del vecchio progetto in qualunque sia il "nuovo" framework di registrazione, tramite una configurazione comune.

risposta

110

si stia mescolando la versione 1.5.6 del ponte JCL con la versione 1.6.0 del slf4j-api; questo non funzionerà a causa di alcune modifiche in 1.6.0. Utilizzare le stesse versioni per entrambi, ad esempio 1.6.1 (l'ultima). Io uso il bridge jcl-over-slf4j tutto il tempo e funziona perfettamente.

+2

Ha funzionato subito, naturalmente; Grazie mille! Non avevo usato 1.6.1 di quei barattoli perché non sembravano essere disponibili. Sono molto seccato con m2eclipse, che pretende di mostrarmi tutte le versioni disponibili ma ne cade misteriosamente un numero significativo. –

+1

Proprio per l'interesse di chiunque altro seguente: ho finito con una freccia rossa nel grafico delle dipendenze, perché anche l'ultima logback-core insiste sulla slf4j-1.6.0. Ci sono volute altre discussioni con le versioni fino a quando tutte le frecce rosse non sono scomparse, ma ora funziona sia con le frecce blu che tutte. –

+1

Come esattamente lo faccio. – user1721803

23

Proprio per aiutare chi ha una situazione simile a me stesso ...

Ciò può essere causato quando una libreria dipendente ha accidentalmente in bundle una vecchia versione di slf4j. Nel mio caso, era tika-0.8. Vedere https://issues.apache.org/jira/browse/TIKA-556

La soluzione consiste esclude il componente e quindi dipendono manualmente la versione corretta o patch.

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

Grazie! Sono stato colpito da questo quando ho provato ad usare Jackrabbit 2.2.5 con SLF4J 1.6.1 e Logback 0.9.28! –

+0

Grazie. Ho collegato alla risposta qui: http://spring-java-ee.blogspot.com/2011/04/using-jackrabbit-jcr-225-with-slf4j-161.html –

41

SLF4J 1.5.11 e 1.6.0 le versioni non sono compatibili (vedi compatibility report), perché la lista degli argomenti di org.slf4j.spi.LocationAwareLogger.log metodo è stato modificato (aggiunto 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) 

rapporti vedere compatibilità fo r altre versioni SLF4J on this page.

È possibile generare tali relazioni lo strumento japi-compliance-checker.

enter image description here

Problemi correlati