web-dev-qa-db-ja.com

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

この問題は、内部でslf4jの下位バージョンを使用しているpom.xml [cxf-bundle-jaxrs]の依存関係の1つが原因でした。この依存関係を最新のリリースにアップグレードすることで、この問題を解決することができました。みんな、ありがとう。

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

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>

私はグーグルで可能な解決策をすべて試しましたが、運はありませんでした。

18
enfany
_Caused by: Java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/StaticLoggerBinder;
_

これは、クラスパスにクラスStaticLoggerBinderがあることを意味します。ただし、クラスパスのクラスにはメソッドgetSingleton()がありません

これは通常、両方が同じ推移的な依存関係を使用する依存関係がある場合に発生します。これは、2つの依存関係(またはアプリと推移的な依存関係)の両方が、異なるバージョンで内部的にSLF4Jを使用していることを意味します。ただし、アプリは同時に1つのバージョンのクラスしか使用できないため、選択する必要があります(ここでルールがわからない...ランダムですか?)

この問題を解決するには、通常_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>
_

親pomを持つマルチモジュールmavenプロジェクトがある場合は、これをmaven dependencyManagement xmlノードで使用できます。

16

この依存関係を含める必要があります:

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

この依存関係を追加すると、問題が解決しました

    <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

なんらかの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>
1