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

这个问题是由我的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.(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 

我的shiro和slf4j的pom.xml是

  org.apache.shiro shiro-core 1.2.2   org.apache.shiro shiro-web 1.2.2   org.apache.shiro shiro-spring 1.2.2   org.slf4j slf4j-api 1.6.1   log4j log4j 1.2.16 runtime  

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

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

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

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

要解决这个问题,你通常需要做一个mvn dependency:tree来查看哪些是使用不同版本的SLF4J。

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

但是对于日志库而言,它有时会有所不同,所以我的解释是出于一般目的,但是很可能你没有使用正确的日志库依赖项,因为它们有非常特殊的包装,这些包装并不总是很容易理解:)


检查我找到的东西:

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


编辑:你应该尝试:

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

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

您需要包含此依赖项:

  org.slf4j slf4j-log4j12 1.7.5  

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

可能你应该尝试以下组合,

SLF4J API模块1.7.5 slf4j API

SLF4J LOG4J-12装订1.7.5 SLF4J LOG4J-12装订

或者,如果您打算使用1.6.1版

    org.slf4j slf4j-log4j12 1.6.1  

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

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