web-dev-qa-db-fra.com

SLF4J: Impossible de charger la classe "org.slf4j.impl.StaticLoggerBinder". dans un projet Maven

J'ai une dépendance pour SLF4J. Je reçois cette erreur:

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.

Voici mon entrée 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>

Où est le problème?


EDIT: Sans la dépendance log4j j'obtiens l'exception suivante

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: C'est un exemple d'arbre MAVEN que je reçois

[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
37
Kayser

Je suppose que vous utilisez Eclipse comme environnement de développement.

Eclipse Juno, Indigo et Kepler lors de l’utilisation de la version maven fournie (m2e) ne suppriment pas le message SLF4J: Impossible de charger la classe "org.slf4j.impl.StaticLoggerBinder". Ce comportement est présent à partir de la version m2e 1.1.0.20120530-0009 et des versions ultérieures.

Bien que ceci soit indiqué comme une erreur, vos journaux seront sauvegardés normalement. L'erreur en surbrillance sera toujours présente jusqu'à la résolution de ce bogue. Plus d'informations à ce sujet dans le site de support m2e .

La solution actuellement disponible consiste à utiliser une version externe maven plutôt que la version fournie d'Eclipse. Vous pouvez trouver à propos de cette solution et plus de détails concernant ce bogue dans la question ci-dessous qui, je crois, décrit le même problème que vous rencontrez.

SLF4J: Echec du chargement de la classe "erreur org.slf4j.impl.StaticLoggerBinder".

Retirer

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

slf4j-log4j12 est la liaison log4j pour slf4j vous n'avez pas besoin d'ajouter une autre dépendance log4j.

Ajouté
Indiquez la configuration log4j dans log4j.properties et ajoutez-le à votre chemin de classe. Il y a des exemples de configurations ici

ou vous pouvez changer votre liaison en

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

si vous configurez slf4j en raison de certaines dépendances le nécessitant.

22
basiljames

J'ai rencontré ce problème dans IntelliJ et je l'ai corrigé en ajoutant ce qui suit à mon 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>
10
3ck

Le message que vous mentionnez est assez clair:

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.

L'API SLF4J n'a pas pu trouver de liaison et a décidé de passer par défaut à une implémentation NOP. Dans votre cas, slf4j-log4j12.jar n'était pas visible lorsque la classe LoggerFactory a été chargée en mémoire, ce qui est certes très étrange. Qu'est-ce que "mvn dependency: tree" vous dit?

Les différentes déclarations de dépendance peuvent même ne pas être directement liées à la cause ici. Je soupçonne fortement qu'une version antérieure à la version 1.6 de slf4j-api.jar est déployé à votre insu.

2
Ceki