web-dev-qa-db-ja.com

logback / slf4jの使用中にスローされた例外

私はslf4j 1.6.2 API jarを使用しています(1.6.1も使用してみました)-ログバックバージョンは0.9.29(コア&クラシック)です。 Ubuntuでjdk1.6を使用しています。受け取った例外を以下にコピーします。

Exception in thread "main" Java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
    at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.Java:112)
    at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.Java:471)
    at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.Java:427)
    at ch.qos.logback.classic.Logger.info(Logger.Java:631)

Slf4jバインディングの不一致について不平を言うメッセージも表示されます。

"SLF4J: The requested version 1.6 by your slf4j binding is not compatible with [1.5.5, 1.5.6, 1.5.7, 1.5.8, 1.5.9, 1.5.10, 1.5.11]"
18
haider

JVMによってロードされるslf4j-api.jarのバージョンがバージョン1.5.xであるように見えます。クラスパスにslf4j-api-1.5.x.jar(slf4j-api-1.6.2.jarに加えて)が確実にあります。クラスパスを確認してください。

25
Ceki

次の依存関係を追加すると役立つ場合があります。

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.7</version>
  </dependency>

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jul-to-slf4j</artifactId>
      <version>1.7.7</version>
  </dependency>

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
      <version>1.7.7</version>
  </dependency>

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>log4j-over-slf4j</artifactId>
      <version>1.7.7</version>
  </dependency>

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-jdk14</artifactId>
      <version>1.7.7</version>
  </dependency>
9

slf4j-apiバージョンはバインディングのバージョンと一致しません:

SLF4Jバインディングは、slf4jをJava.util.loggingおよびそれぞれlog4jなどの基本的なロギングフレームワークにバインドするために使用されるslf4j-jdk14.jarまたはslf4j-log4j12.jarなどのアーティファクトを指定します。

Slf4j-api.jarとSLF4Jバインディングの異なるバージョンを混在させると、問題が発生する可能性があります。たとえば、slf4j-api-1.7.2.jarを使用している場合は、slf4j-simple-1.7.2.jarも使用する必要があります。slf4j-simple-1.5.5.jarを使用しても機能しません。

注クライアントの観点から見ると、slf4j-apiのすべてのバージョンに互換性があります。 slf4j-api-N.jarでコンパイルされたクライアントコードは、NおよびMのslf4j-api-M.jarで完全に正常に実行されます。バインディングのバージョンがslf4j-api.jarのバージョンと一致することを確認するだけです。プロジェクト内の特定の依存関係で使用されるslf4j-api.jarのバージョンについて心配する必要はありません。 slf4j-api.jarの任意のバージョンをいつでも使用できます。slf4j-api.jarのバージョンとそのバインディングが一致する限り、問題ありません。

初期化時に、SLF4Jがapiバージョンとバインディングバージョンの不一致の問題があると疑う場合、疑わしい不一致について警告を発します。

http://www.slf4j.org から得た、それが役立つことを願っています。

8
itro

また、[]に記載されているバージョンのslf4j-api jarファイルが多数必要です。 slf4j-apiおよび対応する互換性のあるslf4j-log4j jarの単一バージョンをクラスパスに保持してみてください。

slf4j jarの異なるバージョンの混合は常に面倒です

NoSuchMethodErrorは、Methods-with-the-same-nameが複数回検出されたためであり、おそらく同じjarの異なるバージョンに由来します。

1
Arun GK

Slf4j-apiのバージョンと対応するバインディングを調整する必要があります。私の場合は、slf4j-log4j12を使用しており、SLF4Jのドキュメントに従っています。

http://www.slf4j.org/codes.html#version_mismatch

推移的な依存関係として含まれている両方のライブラリのバージョンを置き換えて、pomにこれを入れます:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.1</version>
    </dependency>

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

これが誰かに役立つことを願っています。

敬具、

ジェイダー

1
user7009301

まったく同じエラーメッセージが表示されました。依存関係org.Apache.directory.server:apacheds-allを除外することで解決しました。どういうわけか、そのjarはorg.slf4j.spi.LocationAwareLoggerをオーバーライドします

0
jvwilge

これは「私も」かもしれませんが、より完全なソリューションの概要を説明します。私の製品には、さまざまなソースの多くのソフトウェアが混在しています。最初にNiFi JARでこの問題が発生し、次にCassandra JARが再び発生しました。同じバージョンのpom.xmlを主張していましたどこでもslf4j:

<slf4j.version>[1.7.25]</slf4j.version>
...
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>${slf4j.version}</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>${slf4j.version}</version>
</dependency>
... (all the slf4j JARs I needed)

それから、私はMavenにCassandraがslf4jに持ち込むものが何もなしで欲しいと言った:

<dependency>
  <groupId>org.Apache.cassandra</groupId>
  <artifactId>cassandra-all</artifactId>
  <version>${cassandra.version}</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
    </exclusion>
</dependency>

しかし、あなたのように、私は

Exception in thread "main" Java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
  at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.Java:112)

mvndependency:treeから、ログバック1.1.3を取得していることがわかりました。これは、Cassandraが(0.9-something like you) 。そこで、これらの除外を既に存在するslf4jに追加することにより、ログバックの取得も除外しました。

<dependency>
  <groupId>org.Apache.cassandra</groupId>
  <artifactId>cassandra-all</artifactId>
  <version>${cassandra.version}</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
    </exclusion>
    <exclusion>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
    </exclusion>
    <exclusion>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
    </exclusion>
</dependency>

...そこで、私が抱えていた問題とここで報告している問題はなくなりました。これが誰かの助けになることを願っています。

0
Russ Bateman