LoginSignup
4
2

More than 5 years have passed since last update.

SLF4Jでjava.lang.NoSuchMethodError

Posted at

ハマった時のメモです.

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毎にいちいち書かないといけないらしい...

お世話になったサイト

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

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2