Help us understand the problem. What is going on with this article?

SLF4Jでjava.lang.NoSuchMethodError

More than 5 years have passed since last update.

ハマった時のメモです.

Story

JavaでロギングにSLF4J + Logbackを使って開発をしていたが、ある日突然、以下のErrorが出てテストが通らなくなった

java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/StaticLoggerBinder;

Errorが出始めたのは、mavenのpom.xmlにmaven-javadoc-pluginを新しく追加した時だった.

原因

原因は、maven-javadoc-pluginが依存している以下のSLF4Jとロギング実装へのバインディングが、Logback (SLF4Jバインディングを標準で含む) とConflictしてしまった事だった...

  • org.slf4j:slf4j-jdk14
  • org.slf4j:slf4j-nop

どれか一つのみが、Classpathに含まれる...という状態にしないと、実行時にSLF4Jがどの実装を使えばいよいか、判断できない.

環境

  • Java8
  • maven3
  • NetBeans
  • Mac OS 10.10.1

依存関係を調べる

mvn dependency:tree を使って、Projectと.jarの依存関係を調べる事が出来る.

$ mvn dependency:tree -Dverbose

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] -------------------------------------------------
[INFO] Building Foo-Bar-Project 1.0-SNAPSHOT
[INFO] -------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.10:tree (default-cli) @ Foo-Bar-Project ---
[WARNING] Using Maven 2 dependency tree to get verbose output, which may be inconsistent with actual Maven 3 resolution
[INFO] com.foo.bar:Foo-Bar-Project:war:1.0-SNAPSHOT
[INFO] +- javax:javaee-web-api:jar:7.0:provided
...
[INFO] |  +- org.apache.maven.plugins:maven-javadoc-plugin:jar:2.10.1:compile
...
[INFO] |  |  |  |  +- org.slf4j:slf4j-nop:jar:1.5.3:runtime
...
[INFO] |  |  |  +- org.slf4j:slf4j-jdk14:jar:1.5.6:runtime
...

mvn dependency:tree を使うには、たぶんpom.xmlに以下の記述が必要.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.10</version>
        </plugin>
    </plugins>
</build>

余計なSLF4実装を取り除く

maven-dependency-pluginが以下の2つの.jarを取り込んでしまう事が分かったので、これらを依存から外したい.

  • org.slf4j:slf4j-jdk14
  • org.slf4j:slf4j-nop

pom.xmlにこう書く.

<dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.10.1</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
        </exclusion>
    </exclusions>
</dependency>

.jar毎にいちいち書かないといけないらしい...

お世話になったサイト

こちらのサイトのおかげで解決できました。ありがとうございます!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away