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

2022-09-01 20:51:43

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

我正在尝试将Apache Shiro添加到我的CXF Spring Web应用程序中。当我启动我的雄猫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

我的 pom.xml 为 shiro 和 slf4j 是

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

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


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

这意味着您的类路径中有该类。但是类路径的类没有该方法StaticLoggerBindergetSingleton()

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

要解决此问题,您通常需要执行一个操作,以查看哪些正在使用不同版本的SLF4J。mvn dependency:tree

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

但是对于日志记录库来说,它有时有点不同,所以我的解释是用于一般目的,但很可能你没有使用正确的日志记录库依赖项,因为它们具有非常特殊的包,这些打包并不总是易于理解:)


检查我为您找到的内容:

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


编辑:你应该试试:

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

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


答案 2

您需要包含此依赖项:

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

推荐