web-dev-qa-db-fra.com

NoSuchMethodError avec l'API SLF4J

Quand utiliser avec slf4j,

String test = blahblahblah;
logger.info("{}",test);

Tracer comme ci-dessous

Java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;

at org.slf4j.impl.JDK14LoggerAdapter.info(JDK14LoggerAdapter.Java:304)
21
user496949

Il semblerait que votre version ne corresponde pas bien entre les différentes API de SLF4J et les bibliothèques d'intégration. SLF4J est extrêmement instable en ce qui concerne la compatibilité des versions (par exemple, 1.6.x n’est pas rétrocompatible avec 1.5.x). 

Assurez-vous que les différentes versions de JAR correspondent et assurez-vous qu'il n'y a aucun JAR en double sur le chemin d'accès aux classes.

42
skaffman

Je recevais cette erreur:

SLF4J: The requested version 1.6 by your slf4j binding is not compatible with [1.5.5, 1.5.6]
SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details.
Java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
.
.
.

Maintenant, je viens de commenter la ligne avec la version de pom.xml, comme indiqué ci-dessous, et cela fonctionne maintenant:

    <dependency> 
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <!-- <version>1.6.5</version> -->
    </dependency>
6
Akshay Lokur

Vérifiez également si vous déployez dans Glassfish en externe (pas localement) pour supprimer les dépendances en double dans le dossier lib de l'installation Glassfish sur ce serveur.

Dans mon cas, tout fonctionnait bien localement, mais une fois déployé sur un serveur, j'ai eu cette erreur.

1
Eamir Z

Dans mon cas, je recevais le même " Java.lang.NoSuchMethodError " en déployant un fichier EAR sur JBoss EAP 5.2 .

Les journaux ont montré:

SLF4J: La version demandée 1.5.6 par votre liaison slf4j n'est pas compatible avec [1.6]

Journaux: (server.log)

2018-11-05 09:59:46,382 ERROR [STDERR] (main) SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
2018-11-05 09:59:46,395 ERROR [STDERR] (main) SLF4J: The requested version 1.5.6 by your slf4j binding is not compatible with [1.6]
2018-11-05 09:59:46,395 ERROR [STDERR] (main) SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details.
2018-11-05 09:59:46,402 ERROR [org.Apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/common-scheduling/services]] (main) Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.validation.beanvalidation.LocalValidatorFactoryBean#0': Invocation of init method failed; nested exception is Java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1512)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:521)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:296)
at  

Problème:

Le problème était d'avoir deux versions différentes des fichiers jar slf4j-api sur le classpath. (slf4j-log4j12-1.5.6.jar, slf4j-api-1.6.1.jar)

Résolution:

  1. J'ai exécuté "mvn dependency: tree" pour trouver l'emplacement de la dépendance transitive.
  2. Ensuite, j'ai ajouté une balise d'exclusion maven pour exclure la version d'artefact non souhaitée.
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.5.6</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
    </exclusion>
  </exclusions>
</dependency>
0
Peter Tarlos

Je suppose que cela est dû à une version incompatible, comme (si vous exécutez votre application 6.0 et que vous tenez un fichier jar (slf4j 1.5) ou que vous tenez les deux (slf4j 1.5 et 1.6)), une exception peut être levée.

suggestion est recherchez la version appropriée ne placez pas plus d’un fichier de version (slf4f 1.5 et slf4j 1.6) dans le chemin de construction, supprimez celui qui convient. 

et 

alors courez bien, vous l'obtiendrez.

0

Cela ressemble à une version de la classe MessageFormatter différente de celle de votre classe JDK14LoggerAdapter. Contrôlez votre chemin de classe.

0
Paŭlo Ebermann

Dans mon cas, la correspondance de version entre les différentes bibliothèques d’API et d’intégration de SLF4J est correcte. Mais nous utilisons également tika-app jar, qui contient également des classes SLF4J. 

Pour vérifier si vous rencontrez également des fichiers jar (gras) contenant des classes SLF4J, sur le système Unix:

Accédez à votre répertoire WEB-INF/lib/et exécutez la commande suivante

for i in *.jar; do jar -tvf "$i" | grep -Hsi MessageFormatter && echo "$i"; done

Ceci imprimera le résultat correspondant de tous les bocaux de la console.

Enfin, nous avons remplacé tika-app jar par tika-core jar.

0
Bhushan Patil