24

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

CXF Spring Web アプリケーションに Apache Shiro を追加しようとしています。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>

私はグーグルであらゆる解決策を試しましたが、うまくいきませんでした。

4

4 に答える 4

22
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ノードで使用できます。

于 2013-07-19T22:14:08.923 に答える
7

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

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.5</version>
</dependency>
于 2013-07-19T21:46:59.590 に答える
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>
于 2013-07-19T21:46:08.273 に答える