ハマった時のメモです.
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毎にいちいち書かないといけないらしい...
お世話になったサイト
こちらのサイトのおかげで解決できました。ありがとうございます!