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

Java NoSuchMethodError:org.slf4j.impl.StaticLoggerBinder.getSingleton(),java,log4j,slf4j,shiro,Java,Log4j,Slf4j,Shiro,这个问题是由我的pom.xml[cxf bundle jaxrs]中的一个依赖项引起的,它在内部使用较低版本的slf4j。通过将此依赖项升级到最新版本,我成功地解决了此问题。谢谢大家 我正在尝试将ApacheShiro添加到我的CXF Spring web应用程序中。当我启动Tomcat7时,我得到以下错误 Caused by: java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/sl

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

我正在尝试将ApacheShiro添加到我的CXF Spring web应用程序中。当我启动Tomcat7时,我得到以下错误

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
原因:java.lang.NoSuchMethodError:org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/StaticLoggerBinder;
位于org.slf4j.LoggerFactory.bind(LoggerFactory.java:121)
在org.slf4j.LoggerFactory.performinization上(LoggerFactory.java:111)
位于org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:268)
位于org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:241)
位于org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:254)
位于org.apache.shiro.spring.LifecycleBeanPostProcessor。(LifecycleBeanPostProcessor.java:51)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:525)
位于org.springframework.beans.BeanUtils.InstanceClass(BeanUtils.java:100)
位于org.springframework.beans.factory.support.SimpleInstallationStrategy.instantiate(SimpleInstallationStrategy.java:61)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.InstanceBean(AbstractAutowireCapableBeanFactory.java:877)
... 25多
我为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>

org.apache.shiro
西罗岩芯
1.2.2
org.apache.shiro
西罗网
1.2.2
org.apache.shiro
西罗泉
1.2.2
org.slf4j
slf4j api
1.6.1
log4j
log4j
1.2.16
运行时

我通过谷歌搜索尝试了所有可能的解决方案,但没有成功。

有些东西似乎与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>

org.slf4j
slf4j-log4j12
1.6.1      

您需要包含此依赖项:

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

org.slf4j
slf4j-log4j12
1.7.5
这意味着类路径中有类
StaticLoggerBinder
。 但是类路径的类没有方法
getSingleton()

当您的依赖项都使用相同的可传递依赖项时,通常会发生这种情况。这意味着您的两个依赖项(或您的应用程序,以及一个可传递依赖项)都在内部使用不同版本的SLF4J。但是你的应用程序在同一时间只能使用一个版本的类,所以它必须选择(不知道这里的规则…随机?)

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

解决方案通常是在最低版本上使用maven依赖项排除。像SLF4J这样的库往往具有可追溯性,这意味着新版本会不断添加更多功能。有时,一个方法被删除,然后你必须保留旧的库版本,并祈祷。如果这不起作用,还有一些选择,比如

但对于日志库,有时会有点不同,因此我的解释是出于一般目的,但很可能您没有使用正确的日志库依赖项,因为它们有非常特殊的包,不容易理解:)


检查我为您找到的内容:

getSingleton()
方法出现在1.5.6版,因此很可能您有一个库使用了比1.5.6:)旧的SLF4J版本。您只需要通过maven排除(和pray)将其排除


编辑:您应该尝试:

<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>

org.apache.cxf
cxf束jaxrs
2.2
org.slf4j
slf4j-jdk14
org.slf4j
slf4j api

更好的是,如果您有一个具有父pom的多模块maven项目,那么您可以将其与maven dependencyManagement xml节点一起使用。

添加此依赖项为我解决了这个问题

    <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>

org.slf4j
slf4j api
1.7.25
org.slf4j
slf4j-log4j12
1.7.5

I包含了上述依赖项,但仍然得到了相同的错误。
org.slf4j slf4j api 1.7.5 org.slf4j slf4j-log4j12 1.7.5
您需要确保slf4j版本都是相同的。将
slf4j-api
更新至1.7.5或将
slf4j-log4j12
降级至1.6.1I我尝试了这两种方法,但得到了相同的错误
java.lang.NoSuchMethodError:org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/StaticLoggerBinder在我运行
mvn dependency:tree
之后,这里有一些新的线索:我有一个cxf包jaxrs 2.2,它在内部使用
org.slf4j:slf4j-jdk14:jar:1.3.1:runtime
我如何使用依赖排除来解决这个问题-Thanks@KunXiamaven网站对此进行了解释,但我编辑了我的答案。除非您发布完整的依赖项和依赖项:tree outputHanks,否则我无法确定解决方案。Hanks,我已通过将cxf bundle JAXR升级到最新版本来解决此问题。我的错是我应该发布完整的pom.xml。将用解决方案更新我的问题。:)您还应该使用依赖项管理部分来防止此类问题。@SebastienLorber-
    <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>