2012-09-17 6 views
30

Ich habe eine Abhängigkeit für SLF4J. Ich erhalte diese Fehlermeldung:SLF4J: Fehler beim Laden der Klasse "org.slf4j.impl.StaticLoggerBinder". in einem Maven-Projekt

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. 

Hier ist meine Maven-Eintrag:

<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> 

Wo liegt das Problem?


EDIT: Ohne log4j Abhängigkeit erhalte ich die folgende Ausnahme

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: Es ist ein Beispiel MAVEN Baum, den ich

[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 Vielleicht haben Sie eine Idee? – Kayser

+0

ist dies ein eigenständiges Programm oder auf einem Server bereitgestellt? – basiljames

+0

@basiljames ich bekomme den Fehler mit mvn openjpa: SQL-Befehl. Es ist nirgends installiert. – Kayser

Antwort

33

Ich gehe davon aus, dass Sie Eclipse als Entwicklungsumgebung verwenden.

Eclipse Juno, Indigo und Kepler unterdrücken bei Verwendung der gebündelten Maven-Version (m2e) nicht die Meldung SLF4J: Fehler beim Laden der Klasse "org.slf4j.impl.StaticLoggerBinder". Dieses Verhalten tritt ab der m2e-Version 1.1.0.20120530-0009 auf.

Obwohl dies als Fehler angezeigt wird, werden Ihre Protokolle normal gespeichert. Der markierte Fehler wird weiterhin angezeigt, bis der Fehler behoben ist. Mehr dazu in der m2e support site.

Die derzeit verfügbare Lösung ist die Verwendung einer externen Maven-Version anstelle der mitgelieferten Version von Eclipse. Sie können über diese Lösung und weitere Details zu diesem Fehler in der folgenden Frage finden, die ich glaube, beschreibt das gleiche Problem, das Sie konfrontiert sind.

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

+0

Wenn die Verwendung von externen Maven-Version nicht funktioniert, rate ich, den Inhalt Ihres lokalen Maven-Repository zu löschen. – Kowlown

15

Entfernen erhalten

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

slf4j-log4j12 ist die log4j für slf4j Bindung Sie nicht eine andere log4j Abhängigkeit hinzufügen müssen.

Added
die log4j Konfiguration in log4j.properties Geben Sie und es zu Ihrem Klassenpfad hinzufügen. Es gibt Beispielkonfigurationen here

oder können Sie Ihre Bindung ändern

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

wenn Sie slf4j konfigurieren aufgrund einiger Abhängigkeiten erfordern es.

+0

Ich habe es entfernt. Ich bin diese Ausnahme immer ‚Fehlgeschlagen SLF4J LoggerFactory Berichten Ausnahme instanziiert: java.lang.NoClassDefFoundError: org.slf4j.impl.StaticLoggerBinder \t bei org.slf4j.LoggerFactory.bind (LoggerFactory.java:121) \t bei org .slf4j.LoggerFactory.performInitialization (LoggerFactory.java:111) \t bei org.slf4j.LoggerFactory.getILoggerFactory (LoggerFactory.java:268) ' – Kayser

+0

Eine ähnliche [post] (http://stackoverflow.com/questions/7421612/ slf4j-failed-to-load-class-org-slf4j-impl-staticloggerbinder) – basiljames

+0

Wenn slf4j-log4j eine Abhängigkeit deklariert wird log4j als Abhängigkeit hinzufügen ist unnötig, aber es sollte auch nicht weh tun. Darüber hinaus ist log4j.properties irrelevant für die gestellte Frage. – Ceki

2

Die Nachricht, die Sie erwähnen, ist ganz klar:

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 eine Bindung nicht finden konnte, und beschlossen, eine NOP Implementierung auf Standard. In Ihrem Fall war slf4j-log4j12.jar irgendwie nicht sichtbar, wenn die LoggerFactory-Klasse in den Speicher geladen wurde, was freilich sehr ist. Was sagt dir "mvn dependency: tree"?

Die verschiedenen Abhängigkeitsdeklarationen dürfen hier nicht einmal direkt vorliegen. Ich vermute stark, dass eine Version 1.6.0 von slf4j-api.jar ohne Ihr Wissen bereitgestellt wird.

+0

Das ist, was Abhängigkeit: Baum erzählt: '[INFO] [INFO] --- maven-Abhängigkeit-Plugin: 2.5.1: Baum (Standard-CLI) @ GEM_Web --- [INFO] com.mycompany.proj : My_Web: war: 0.0.1-SNAPSHOT ... [INFO] + - javax.servlet: jstl: jar: 1.2: bereitgestellt [INFO] + - org.slf4j: slf4j-api: jar: 1.6.6: kompilieren [INFO] + - org.slf4j: slf4j-einfach: jar: 1.6.6: kompilieren [INFO] \ - org.mockito: mockito-all: jar: 1.9.0: test' – Kayser

+0

Das obige ist nicht sehr lesbar. IMO, sollte es in den Frageteil verschoben werden. – Ceki

+0

Danke für den Hinweis. Ich habe die Frage aktualisiert – Kayser

6

Ich lief in dieses in IntelliJ und fixiert die durch Zugabe von folgenden meiner 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

Eine bessere Lösung wäre, ein 'dependencyManagement' Element zu verwenden, welches die Version für 'slf4j-api' –

+0

auf den Punkt bringt. Ich benutze Spring Boot 15. Diese Lösung funktionierte für mich –