私は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]"
JVMによってロードされるslf4j-api.jarのバージョンがバージョン1.5.xであるように見えます。クラスパスにslf4j-api-1.5.x.jar(slf4j-api-1.6.2.jarに加えて)が確実にあります。クラスパスを確認してください。
次の依存関係を追加すると役立つ場合があります。
<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>
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 から得た、それが役立つことを願っています。
また、[]に記載されているバージョンのslf4j-api jarファイルが多数必要です。 slf4j-apiおよび対応する互換性のあるslf4j-log4j jarの単一バージョンをクラスパスに保持してみてください。
slf4j jarの異なるバージョンの混合は常に面倒です
NoSuchMethodErrorは、Methods-with-the-same-nameが複数回検出されたためであり、おそらく同じjarの異なるバージョンに由来します。
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>
これが誰かに役立つことを願っています。
敬具、
ジェイダー
まったく同じエラーメッセージが表示されました。依存関係org.Apache.directory.server:apacheds-all
を除外することで解決しました。どういうわけか、そのjarはorg.slf4j.spi.LocationAwareLogger
をオーバーライドします
これは「私も」かもしれませんが、より完全なソリューションの概要を説明します。私の製品には、さまざまなソースの多くのソフトウェアが混在しています。最初に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>
...そこで、私が抱えていた問題とここで報告している問題はなくなりました。これが誰かの助けになることを願っています。