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

enf*_*any 16 java log4j slf4j shiro

这个问题是由我的pom.xml [cxf-bundle-jaxrs]中的一个依赖项引起的,它在内部使用较低版本的slf4j.我设法通过将此依赖项升级到最新版本来解决此问题.感谢大家.

我正在尝试将Apache Shiro添加到我的CXF Spring Web应用程序中.当我启动我的tomcat 7时,我收到以下错误

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
Run Code Online (Sandbox Code Playgroud)

我的shiro和slf4j的pom.xml是

<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>
Run Code Online (Sandbox Code Playgroud)

我通过谷歌搜索尝试了所有可能的解决方案,但没有运气.

Seb*_*ber 16

Caused by: java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/StaticLoggerBinder;
Run Code Online (Sandbox Code Playgroud)

这意味着您在类StaticLoggerBinder路径中拥有该类.但是类路径的类没有方法getSingleton()

当您具有使用相同传递依赖性的依赖项时,通常会发生这种情况.这意味着您的2个依赖项(或您的应用程序和传递依赖项)都在内部使用不同版本的SLF4J.但是你的应用程序只能同时使用该类的单个版本,因此必须选择(不知道这里的规则......随机吗?)

要解决这个问题,您通常需要mvn dependency:tree查看哪些使用不同版本的SLF4J.

解决方案通常是在最低版本上使用maven依赖项排除.像SLF4J这样的库往往是反向兼容的,这意味着新版本不断添加更多功能.有时,一个方法被删除,然后你必须保持旧库版本,并祈祷.如果这不起作用,仍然有一些选项,如JarJar

但是,对于记录库,它有时有点不同,所以我的解释是通用的,但它很可能你没有使用正确的登录库的依赖,因为他们有非常特别的包装,其并不总是很容易理解:)


检查我找到的东西:

getSingleton()方法出现在版本1.5.6,因此很可能你有一个使用早于1.5.6的SLF4J版本的库:)你只需要用maven排除(并祈祷)排除它.


编辑:你应该尝试:

<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>
Run Code Online (Sandbox Code Playgroud)

更好的是,如果你有一个带有父pom的多模块maven项目,你可以将它与maven dependencyManagement xml节点一起使用.


Dan*_*lan 5

您需要包含此依赖项:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.5</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

  • 您需要确保slf4j版本完全相同.将`slf4j-api`更新为1.7.5或将`slf4j-log4j12`降级为1.6.1 (2认同)

SSa*_*ker 2

有些东西似乎与那些 sl4j-api 和 log4j 版本不兼容。 试试这个链接并找到正确且兼容的依赖项并使用它们。

也许你应该尝试以下组合,

SLF4J API 模块 1.7.5 slf4j API

SLF4J LOG4J-12 绑定 1.7.5 SLF4J LOG4J-12 绑定

或者,如果您计划使用版本 1.6.1

 <!-- slf4j-log4j -->       
    <dependency>            
          <groupId>org.slf4j</groupId>          
          <artifactId>slf4j-log4j12</artifactId>     
          <version>1.6.1</version>      
    </dependency>
Run Code Online (Sandbox Code Playgroud)