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)
さまざまなSLF4J APIと統合ライブラリのバージョンが一致していないようです。 SLF4Jは、バージョンの互換性に関して非常に不安定です(たとえば、1.6.xは1.5.xと下位互換性がありません)。
さまざまなJARバージョンが一致することを確認し、クラスパスに重複するJARがないことを確認します。
私はこのエラーを受け取っていました:
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>
また、Glassfishを外部(ローカルではなく)にデプロイして、そのサーバー上のGlassfishインストールのlibフォルダー内の重複する依存関係を削除することも確認してください。
私の場合、すべてがローカルで正常に機能していましたが、サーバーにデプロイするとこのエラーが発生しました。
私の場合、同じ "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)
解像度:
<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>
これは、アプリケーション6.0を実行してjarファイルを保持している場合(slf4j 1.5)または両方を保持している場合(slf4j 1.5および1.6)などの互換性のないバージョンが原因であると考えられます。
適切なバージョンの提案は、ビルドパスに複数のバージョンファイル(slf4f 1.5およびslf4j 1.6)ファイルを配置しないでください。適切なバージョンを削除してください
そして
その後、実行してください、あなたはそれを取得します。
これは、JDK14LoggerAdapterクラスとは異なるMessageFormatterクラスのバージョンがあるように見えます。クラスパスを制御します。
私の場合、さまざまな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に置き換えました。