web-dev-qa-db-fra.com

NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton ()

Le problème était dû à l'une des dépendances de mon pom.xml [cxf-bundle-jaxrs] qui utilise en interne la version inférieure de slf4j. J'ai réussi à résoudre ce problème en mettant à niveau cette dépendance vers la dernière version. Merci tout le monde.

J'essaie d'ajouter Apache Shiro à mon application Web CXF Spring. Au démarrage de Tomcat 7, le message d'erreur suivant s'affiche:

Caused by: Java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/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.shiro.spring.LifecycleBeanPostProcessor.<clinit>(LifecycleBeanPostProcessor.Java:51)
at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:57)
at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:45)
at Java.lang.reflect.Constructor.newInstance(Constructor.Java:525)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.Java:100)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.Java:61)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.Java:877)
... 25 more

et mon pom.xml pour shiro et slf4j est 

<dependency>
        <groupId>org.Apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.2.2</version>
    </dependency>
    <dependency>
        <groupId>org.Apache.shiro</groupId>
        <artifactId>shiro-web</artifactId>
        <version>1.2.2</version>
    </dependency>
    <dependency>
        <groupId>org.Apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.2.2</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
        <scope>runtime</scope>
    </dependency>

J'ai essayé toutes les solutions possibles en googlant, mais pas de chance.

13
enfany
Caused by: Java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/StaticLoggerBinder;

Cela signifie que vous avez la classe StaticLoggerBinder dans votre chemin de classe . Mais la classe de votre chemin de classe n'a pas la méthode getSingleton()

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

Pour résoudre le problème, vous devez généralement utiliser un mvn dependency:tree pour savoir quelles versions utilisent différentes versions de SLF4J.

La solution consiste souvent à utiliser une exclusion de dépendance maven sur la version la plus basse. Les bibliothèques telles que SLF4J ont tendance à être rétrocompatibles, ce qui signifie que les nouvelles versions continuent d’ajouter de nouvelles fonctionnalités. Parfois, une méthode est supprimée et vous devez ensuite conserver l'ancienne version de la bibliothèque et prier. Si cela ne fonctionne pas, il reste quelques options, comme JarJar

Mais pour les bibliothèques de journalisation, c'est parfois un peu différent, donc mon explication est générale, mais il est probable que vous n'utilisiez pas les dépendances de bibliothèque de journalisation correctes car elles ont des paquets très spéciaux qui ne sont pas toujours faciles à comprendre :)


Vérifiez ce que j'ai trouvé pour vous:

La méthode getSingleton() étant apparue à la version 1.5.6, il est donc très probable que votre bibliothèque utilise une version de SLF4J antérieure à 1.5.6 :) Il vous suffit de l’exclure avec une exclusion maven (et de prier).


Edit: vous devriez essayer:

<dependency>
  <groupId>org.Apache.cxf</groupId>
  <artifactId>cxf-bundle-jaxrs</artifactId>
  <version>2.2</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-jdk14</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
    </exclusion>
  </exclusions> 
</dependency>

Mieux, si vous avez un projet maven multimodule avec un pom parent, vous pouvez l’utiliser avec le nœud XML maven dependencyManagement.

14
Sebastien Lorber

Vous devez inclure cette dépendance:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.5</version>
</dependency>
5
Daniel Kaplan

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>
1
Akhil Jain

Quelque chose ne semble pas être compatible avec les versions sl4j-api et log4j . Essayez ce lien et trouvez les dépendances correctes et compatibles et utilisez-les.

Peut-être devriez-vous essayer la combinaison suivante,

Module API SLF4J 1.7.5 L'API slf4j

Reliure SLF4J LOG4J-12 1.7.5 Reliure SLF4J LOG4J-12

Ou, si vous envisagez d'utiliser la version 1.6.1

 <!-- slf4j-log4j -->       
    <dependency>            
          <groupId>org.slf4j</groupId>          
          <artifactId>slf4j-log4j12</artifactId>     
          <version>1.6.1</version>      
    </dependency>
1
SSaikia_JtheRocker