web-dev-qa-db-ja.com

SLF4J APIを使用したNoSuchMethodError

Slf4jで使用する場合、

String test = blahblahblah;
logger.info("{}",test);

以下のようにトレース

Java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;

at org.slf4j.impl.JDK14LoggerAdapter.info(JDK14LoggerAdapter.Java:304)
23
user496949

さまざまなSLF4J APIと統合ライブラリのバージョンが一致していないようです。 SLF4Jは、バージョンの互換性に関して非常に不安定です(たとえば、1.6.xは1.5.xと下位互換性がありません)。

さまざまなJARバージョンが一致することを確認し、クラスパスに重複するJARがないことを確認します。

45
skaffman

私はこのエラーを受け取っていました:

SLF4J: The requested version 1.6 by your slf4j binding is not compatible with [1.5.5, 1.5.6]
SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details.
Java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
.
.
.

次に、以下に示すように、pom.xmlのバージョンの行をコメントしましたが、現在は機能しています。

    <dependency> 
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <!-- <version>1.6.5</version> -->
    </dependency>
7
Akshay Lokur

また、Glassfishを外部(ローカルではなく)にデプロイして、そのサーバー上のGlassfishインストールのlibフォルダー内の重複する依存関係を削除することも確認してください。

私の場合、すべてがローカルで正常に機能していましたが、サーバーにデプロイするとこのエラーが発生しました。

1
Eamir Z

私の場合、同じ "Java.lang.NoSuchMethodError" EARファイルをJBoss EAP 5.2にデプロイしています。

ログに示されたもの:

SLF4J:slf4jバインディングによって要求されたバージョン1.5.6は、[1.6]と互換性がありません

ログ:(server.log)

2018-11-05 09:59:46,382 ERROR [STDERR] (main) SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
2018-11-05 09:59:46,395 ERROR [STDERR] (main) SLF4J: The requested version 1.5.6 by your slf4j binding is not compatible with [1.6]
2018-11-05 09:59:46,395 ERROR [STDERR] (main) SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details.
2018-11-05 09:59:46,402 ERROR [org.Apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/common-scheduling/services]] (main) Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.validation.beanvalidation.LocalValidatorFactoryBean#0': Invocation of init method failed; nested exception is Java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1512)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:521)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:296)
at  

問題:

問題は、クラスパスにslf4j-api jarの2つの異なるバージョンがあったことでした。 (slf4j-log4j12-1.5.6.jar、slf4j-api-1.6.1.jar)

解像度:

  1. 「mvndependency:tree」を実行して、推移的な依存関係の場所を見つけました。
  2. 次に、maven除外タグを追加して、望ましくないアーティファクトバージョンを除外します。
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.5.6</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
    </exclusion>
  </exclusions>
</dependency>
0
Peter Tarlos

これは、アプリケーション6.0を実行してjarファイルを保持している場合(slf4j 1.5)または両方を保持している場合(slf4j 1.5および1.6)などの互換性のないバージョンが原因であると考えられます。

適切なバージョンの提案は、ビルドパスに複数のバージョンファイル(slf4f 1.5およびslf4j 1.6)ファイルを配置しないでください。適切なバージョンを削除してください

そして

その後、実行してください、あなたはそれを取得します。

これは、JDK14LoggerAdapterクラスとは異なるMessageFormatterクラスのバージョンがあるように見えます。クラスパスを制御します。

0
Paŭlo Ebermann

私の場合、さまざまなSLF4J APIと統合ライブラリのバージョンが正しく一致しています。しかし、tika-app jarも使用しています。これには、SLF4Jクラスも含まれています。

SLF4Jクラスを含む(fat)jarも持っているかどうかを確認するには、Unixシステムで:

WEB-INF/lib /ディレクトリに移動し、次のコマンドを実行します

for i in *.jar; do jar -tvf "$i" | grep -Hsi MessageFormatter && echo "$i"; done

これにより、すべてのjarから一致する結果がコンソールに出力されます。

最後に、tika-app jarをtika-core jarに置き換えました。

0
Bhushan