2012-09-17 19 views
30

Ho una dipendenza per SLF4J. Sto ottenendo questo errore:SLF4J: Impossibile caricare la classe "org.slf4j.impl.StaticLoggerBinder". in un progetto Maven

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 

Ecco la mia voce di Maven:

<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.6.6</version> 
    </dependency> 

    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-log4j12</artifactId> 
     <version>1.6.6</version> 
    </dependency> 
    <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.16</version> 
    </dependency> 

Dov'è il problema?


EDIT: Senza log4j dipendenza ottengo la seguente eccezione

Failed to instantiate SLF4J LoggerFactory 
Reported exception: 
java.lang.NoClassDefFoundError: org.slf4j.impl.StaticLoggerBinder 
    at org.slf4j.LoggerFactory.bind(LoggerFactory.java:121) 
    at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:111) 
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:268) 
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:241) 
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:254) 
    at org.apache.bval.jsr303.ConfigurationImpl.<clinit>(ConfigurationImpl.java:50) 
    at java.lang.J9VMInternals.initializeImpl(Native Method) 
    at java.lang.J9VMInternals.initialize(J9VMInternals.java:228) 
    at org.apache.bval.jsr303.ApacheValidationProvider.createGenericConfiguration(ApacheValidationProvider.java:66) 
    at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:173) 
    at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:50) 
    at com.daimler.zv9.basic.entity.AbstractEntity.<clinit>(AbstractEntity.java:73) 
    at java.lang.J9VMInternals.initializeImpl(Native Method) 
    at java.lang.J9VMInternals.initialize(J9VMInternals.java:228) 
    at java.lang.J9VMInternals.initialize(J9VMInternals.java:195) 
    at java.lang.Class.forNameImpl(Native Method) 
    at java.lang.Class.forName(Class.java:168) 

EDIT2: Si tratta di un esempio MAVEN albero che ricevo

[INFO] com.myCompany.abc:ABC_Document:ejb:0.0.1-SNAPSHOT 
[INFO] +- com.myCompany.abc:ABC_Basic:jar:0.0.1-SNAPSHOT:compile 
[INFO] +- com.myCompany.iap:javax.j2ee:jar:5.0.0:provided 
[INFO] +- com.myCompany.iap:logging:jar:5.0.0:provided 
[INFO] +- com.myCompany.iap:util:jar:5.0.0:provided 
[INFO] +- junit:junit:jar:4.8.2:test 
[INFO] +- javax.servlet:jstl:jar:1.2:provided 
[INFO] +- org.slf4j:slf4j-api:jar:1.6.6:compile 
[INFO] +- org.slf4j:slf4j-simple:jar:1.6.6:compile 
[INFO] \- org.mockito:mockito-all:jar:1.9.0:test 
+0

@Ceki Forse avete un'idea? – Kayser

+0

è un programma autonomo o implementato in alcuni server? – basiljames

+0

@basiljames ottengo l'errore con mvn openjpa: comando sql. non è installato da nessuna parte. – Kayser

risposta

33

Suppongo che si stia utilizzando Eclipse come ambiente di sviluppo.

Eclipse Juno, Indigo e Kepler quando si utilizza la versione di Maven in bundle (m2e), non sopprimono il messaggio SLF4J: Impossibile caricare la classe "org.slf4j.impl.StaticLoggerBinder". Questo comportamento è presente dalla versione m2e 1.1.0.20120530-0009 e successive.

Anche se questo è indicato come errore, i registri verranno salvati normalmente. L'errore evidenziato sarà ancora presente fino a quando non ci sarà una correzione di questo bug. Maggiori informazioni su questo nello m2e support site.

L'attuale soluzione disponibile consiste nell'utilizzare una versione esterna di Maven anziché la versione in bundle di Eclipse. Puoi trovare su questa soluzione e maggiori dettagli su questo bug nella domanda qui sotto che credo descriva lo stesso problema che stai affrontando.

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". error

+0

Se l'uso della versione esterna di Maven non funziona, ti consiglio di eliminare il contenuto del tuo repository Maven locale. – Kowlown

15

Rimuovere

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.16</version> 
</dependency> 

slf4j-log4j12 è l'associazione per slf4j non avete bisogno di aggiungere un altro dipendenza log4j log4j.

Aggiunto
fornire la configurazione log4j in log4j.properties e aggiungerlo al tuo percorso di classe. Ci sono esempi di configurazione here

o si può cambiare il tuo legame con

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-simple</artifactId> 
    <version>1.6.1</version> 
</dependency> 

se si sta configurando slf4j a causa di alcune dipendenze che lo richiedono.

+0

L'ho rimosso. Sto ottenendo questa eccezione 'Impossibile creare un'istanza SLF4J LoggerFactory eccezione Segnalato: java.lang.NoClassDefFoundError: org.slf4j.impl.StaticLoggerBinder \t a org.slf4j.LoggerFactory.bind (LoggerFactory.java:121) \t a org .slf4j.LoggerFactory.performInitialization (LoggerFactory.java:111) \t a org.slf4j.LoggerFactory.getILoggerFactory (LoggerFactory.java:268) ' – Kayser

+0

Un simile [post] (http://stackoverflow.com/questions/7421612/ slf4j-fall-to-load-class-org-slf4j-impl-staticloggerbinder) – basiljames

+0

Quando slf4j-log4j viene dichiarato come dipendenza, l'aggiunta di log4j come dipendenza non è necessaria ma non dovrebbe danneggiarla. Inoltre, log4j.properties è irrilevante rispetto alla domanda che viene posta. – Ceki

2

Il messaggio si parla è piuttosto chiaro:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 

SLF4J API non riusciva a trovare un legame, e ha deciso di passare automaticamente a un'implementazione NOP. Nel tuo caso, slf4j-log4j12.jar era in qualche modo non visibile quando la classe LoggerFactory è stata caricata in memoria, il che è certamente molto strano. Che cosa dice "mvn dependency: tree"?

Le varie dichiarazioni di dipendenza potrebbero anche non essere direttamente in causa. Sospetto fortemente che una versione precedente alla 1.6 di slf4j-api.jar venga distribuita a tua insaputa.

+0

Ecco cos'è la dipendenza: albero dice: '[INFO] [INFO] --- plugin-dependency-plugin: 2.5.1: tree (default-cli) @ GEM_Web --- [INFO] com.mycompany.proj : My_Web: war: 0.0.1-SNAPSHOT ... [INFO] + - javax.servlet: jstl: jar: 1.2: fornito [INFO] + - org.slf4j: slf4j-api: jar: 1.6.6: compilare [INFO] + - org.slf4j: slf4j-semplice: jar: 1.6.6: compilare [INFO] \ - org.mockito: mockito-all: jar: 1.9.0: test' – Kayser

+0

Quanto sopra non è molto leggibile. IMO, dovrebbe essere spostato nella parte domanda. – Ceki

+0

Grazie per il suggerimento. Ho aggiornato la domanda – Kayser

6

mi sono imbattuto in questo IntelliJ e fissato con l'aggiunta del seguente al mio pom:

<!-- logging dependencies --> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>${logback.version}</version> 
     <exclusions> 
      <exclusion> 
       <!-- Defined below --> 
       <artifactId>slf4j-api</artifactId> 
       <groupId>org.slf4j</groupId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
+0

Una soluzione migliore sarebbe usare un elemento 'dependencyManagement' che annulla la versione di' slf4j-api' –

+0

Sto usando l'avvio a molla 15. Questa soluzione ha funzionato per me –

Problemi correlati