web-dev-qa-db-fra.com

SLF4J NoSuchMethodError sur LocationAwareLogger

C'est une question qui a déjà été posée, mais malheureusement aucune solution ne semble fonctionner pour moi. Je fais face à cette exception (avec trace de pile abrégée):

Java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V
    at org.Apache.commons.logging.impl.SLF4JLocationAwareLog.debug(SLF4JLocationAwareLog.Java:133)
    at org.Apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.Java:221)
    at org.Apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.Java:401)
    at org.Apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.Java:820)

Cela se produit lors de la compilation à l'aide d'une ligne de commande Maven et également lors du déploiement sur Tomcat. Cela fonctionne bien à l'intérieur d'IntelliJ IDEA.

Habituellement, je m'attendrais à ce que cela soit dû à l'utilisation de plusieurs versions de la bibliothèque SLF4J. Mais l'arborescence des dépendances Maven affiche toutes les bibliothèques slf4j dans une seule version:

..$ mvn dependency:tree | grep slf4j
[INFO] +- org.slf4j:slf4j-simple:jar:1.6.4:compile
[INFO] |  \- org.slf4j:slf4j-api:jar:1.6.4:compile
[INFO] +- org.slf4j:slf4j-api:jar:1.6.4:compile
[INFO] +- org.slf4j:jcl-over-slf4j:jar:1.6.4:compile
[INFO] +- org.slf4j:slf4j-simple:jar:1.6.4:compile

Je me suis même assuré qu'il n'y avait pas d'autre JAR dans ~/.m2/repository

Il n'y a pas non plus de références aux bibliothèques de journalisation des biens communs (je les ai toutes exclues, comme le confirme l'arborescence des dépendances.

Comment puis-je résoudre ce problème? Je suis à court d'idées.

EDIT: comme demandé ici les dépendances complètes, d'abord le POM parent:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>${org.hibernate.validator.version}</version>
            <exclusions>
                <!-- Exclude SLF4j to avoid version conflicts (we have 1.6.2, this drags in 1.6.1) -->
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator-annotation-processor</artifactId>
            <version>${org.hibernate.validator.version}</version>
        </dependency>

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.0.0.GA</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org.springframework.version}</version>
            <exclusions>
                <!-- Exclude Commons Logging in favor of SLF4j -->
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>${org.slf4j.backend}</artifactId>
            <version>${org.slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>2.2.4</version>
        </dependency>
        <dependency>
            <groupId>org.Apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time-jsptags</artifactId>
            <version>1.0.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.0-801.jdbc4</version>
        </dependency>
        <dependency>
            <groupId>org.Apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.0.1</version>
        </dependency>
    </dependencies>
</dependencyManagement>

Et puis le module qui échoue:

<dependencies>
    // client specific dependencies skipped //

    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>10.0.1</version>
    </dependency>

    <!-- Spring -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <exclusions>
            <!-- Exclude Commons Logging in favor of SLF4j -->
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-core</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
    </dependency>
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>2.2.2</version>
    </dependency>

    <!-- Logging -->
    <dependency>
        <groupId>net.sf.opencsv</groupId>
        <artifactId>opencsv</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${org.slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>${org.slf4j.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>${org.slf4j.backend}</artifactId>
        <version>${org.slf4j.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
    </dependency>

    <!-- Joda Time -->
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
    </dependency>
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time-jsptags</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Servlet -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>
    <dependency>
        <groupId>com.google.visualization</groupId>
        <artifactId>visualization-datasource</artifactId>
        <version>1.0.2</version>
    </dependency>

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.0.2</version>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.0</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.1</version>
    </dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.2.2</version>
    </dependency>

    <dependency>
        <groupId>org.Apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.7</version>
    </dependency>
    <dependency>
        <groupId>org.Apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.7</version>
    </dependency>
    <dependency>
        <groupId>org.Apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>3.7</version>
    </dependency>

    <dependency>
        <groupId>postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <scope>test</scope>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
</dependencies>

Ce sont les propriétés définies sur le parent:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <org.hibernate.validator.version>4.2.0.Final</org.hibernate.validator.version>
    <org.slf4j.backend>slf4j-simple</org.slf4j.backend>
    <org.slf4j.version>1.6.4</org.slf4j.version>
    <org.springframework.version>3.0.5.RELEASE</org.springframework.version>
</properties>

Compte tenu de mes récentes expériences, cela ne semble pas être un problème lié aux fichiers du projet. J'ai essayé de "bissecter hg" le problème, mais il y a quelques semaines, je n'ai pas pu trouver de version qui fonctionne. Certains d'entre eux s'exécutent dans des systèmes de production, il est donc peu probable qu'un changement de code provoque ce problème.

29
Peter Becker

Les javadocs pour NoSuchMethodError disent,

Normalement, cette erreur est détectée par le compilateur; cette erreur ne peut se produire au moment de l'exécution que si la définition d'une classe a changé de manière incompatibl.

C'est probablement dû au chargement de versions incompatibles de slf4j. Plutôt que de regarder votre chemin de classe et de deviner où les classes sont chargées, trouvez où votre classe est chargée comme décrit ici .

Imprimez où org.slf4j.spi.LocationAwareLogger, org.Apache.commons.logging.impl.SLF4JLocationAwareLog et org.slf4j.Marker sont en cours de chargement.

23
sbridges

Nous étions confrontés au même problème et il s'est avéré que nous avions 2 versions incompatibles de pots slf4j dans le chemin de classe. Le chemin de classe avait les 2 versions incompatibles suivantes. Après avoir supprimé les versions inférieures du chemin de classe, le problème a été résolu.

slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar

slf4j-api-1.5.11.jar
slf4j-log4j12-1.5.11.jar

1
Hari

Une solution.

Vérifiez sur le répertoire Eclipse: configuration\org.Eclipse.equinox.simpleconfigurator\bundles.info

slf4j plus un

1
user2093980

faire

dépendance propre mvn: tree -DskipTests;

supprimer toutes les dépendances de "org.slf4j" sauf une (la plus élevée ") comme

    <dependency>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.6</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-jdk14</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>jcl-over-slf4j</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
1
Victor

J'ai eu le même message d'erreur, mais la solution était différente pour moi. J'ai dû supprimer à la dépendance suivante du pom maven:

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

Après cela, l'erreur disparaît et tout a fonctionné pour moi.

1
PowerStat

Résolu !!!

Je dépendais d'un autre projet qui utilisait le plugin JavaDoc. JavaDoc le plugin utilise en interne Maven-core et Maven-core-2.2.1 utilise jcl-over-slf4j: 1.5.6. Maven-core Est un pot de niveau parent.

Maintenant, en raison de ce bocal JCL, j'étais confronté à ce problème. Par conséquent, je l'ai supprimé du dossier lib de weblogic (ou du serveur que vous utilisez).

Et hélas !! Le problème a été résolu.

Remarque 1: - Vous pouvez également utiliser la balise <exclusion> De Maven pour supprimer cette dépendance du JavaDoc (ou de tout autre plugin) pour résoudre ce problème.

Remarque 2: - Utilisez l'onglet Dependency Hierarchy Dans POM pour voir si de tels anciens pots SLF4J Sont présents. Et supprimez le reste et ne gardez qu'une seule version.

J'espère que ça aide ..

0
AnirbanDebnath

Cela se produit généralement lorsque vous avez des dépendances qui utilisent toutes deux la même dépendance transitive. Cela signifie que 2 de vos dépendances (ou votre application et une dépendance transitive) utilisent toutes deux SLF4J en interne avec différentes versions. Mais votre application ne peut utiliser qu'une seule version de la classe en même temps, elle doit donc choisir (vous ne connaissez pas les règles ici ... au hasard?)

Pour résoudre le problème, vous devez généralement effectuer une mvn dependency:tree pour voir lesquelles utilisent différentes versions de SLF4J.

L'ajout de cette dépendance a résolu le problème pour moi

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

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.5</version>
</dependency>
0
Akhil Jain

J'avais un planificateur de quartz dans mon fichier pom, qui comprenait slf4j, donc je l'ai exclu:

<exclusion>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
</exclusion>

et travaillé!

0
russellhoff