Gradle で NoClassDefFoundError でビルドできない時
注意
この記事は Qiita からサルベージした古いエントリです。内容が古くなっている可能性が高いので、ご注意ください。
結論
Gradle 1.12 で Java8 使ってませんか。
経緯
build.gradle
に変更を入れていないのに突然ビルドがコケ出した。
とりあえず --debug
オプションつけて実行してみる。
$ ./gradlew tasks --debug
(省略)
15:49:07.706 [ERROR] [org.gradle.BuildExceptionReporter] FAILURE: Build failed with an exception.
15:49:07.707 [ERROR] [org.gradle.BuildExceptionReporter]
15:49:07.707 [ERROR] [org.gradle.BuildExceptionReporter] * Where:
15:49:07.707 [ERROR] [org.gradle.BuildExceptionReporter] Build file '~/src/github.com/yukung/some-project/build.gradle' line: 167
15:49:07.707 [ERROR] [org.gradle.BuildExceptionReporter]
15:49:07.708 [ERROR] [org.gradle.BuildExceptionReporter] * What went wrong:
15:49:07.708 [ERROR] [org.gradle.BuildExceptionReporter] A problem occurred evaluating root project 'some-project'.
15:49:07.708 [ERROR] [org.gradle.BuildExceptionReporter] > [Ljava/util/HashMap$Entry;
15:49:07.709 [ERROR] [org.gradle.BuildExceptionReporter]
15:49:07.709 [ERROR] [org.gradle.BuildExceptionReporter] * Exception is:
15:49:07.724 [ERROR] [org.gradle.BuildExceptionReporter] org.gradle.api.GradleScriptException: A problem occurred evaluating root project
(省略)
15:49:07.742 [ERROR] [org.gradle.BuildExceptionReporter] Caused by: java.lang.NoClassDefFoundError: [Ljava/util/HashMap$Entry;
原因
$ ./gradlew --version
------------------------------------------------------------
Gradle 1.12
------------------------------------------------------------
Build time: 2014-04-29 09:24:31 UTC
Build number: none
Revision: a831fa866d46cbee94e61a09af15f9dd95987421
Groovy: 1.8.6
Ant: Apache Ant(TM) version 1.9.3 compiled on December 23 2013
Ivy: 2.2.0
JVM: 1.8.0_20 (Oracle Corporation 25.20-b23) # <-- コレがおかしい
OS: Mac OS X 10.9.5 x86_64
$ java -version
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
Gradle の Java8 サポートは Gradle 2.0 から。(というか Gradle が使っている Groovy のバージョンが Gradle 1.12 だと Groovy 1.8.6 なので Java8 対応していない)
この辺りに書いてあります。
これは Gradle 徹底入門にも書いてあります。読んでてよかった Gradle 徹底入門。さすがデス。
これに引っかかった人はとりあえず買った方がいいと思います。(私の場合は読んでいたのですぐピンと来たけどもし買ってなかったら更にハマり時間を浪費していた…のでこれだけで 3,800 円の元を取った気がするw)
蛇足
私は ~/.bashrc
に
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
こんな設定をしていて、普段それを GitHub で dotfiles として管理しているのですが、今触っているプロジェクトは諸事情で Java7 なのでローカル上 1.7
に書き換えてました。
それがさっき dotfiles をゴニョゴニョして push した関係で git stash
していたのをすっかり忘れていてコノザマ(´・ω・`)ショボーン