表題通り、IntelliJ IDEA 2016.3 で Dagger 2 を使っているとビルド時に次のようなエラーが発生する。
java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.impl.CompilerOptions.versionToJdkLevel(Ljava/lang/Object;)J
手元では Dagger 2.8 と 2.6 で確認した。
YouTrack のチケット
既に YouTrack にはチケットが登録されていて、解決済みになっている。
原因
チケットの情報を見る感じ、以下のような感じっぽい。
- Eclipse Java Compiler 4.6.1 の JAR を IntelliJ IDEA が持っている。 コンパイル時にはそれがクラスパスに追加される。
- Dagger も Eclipse Java Compiler に依存している。 4.6.1 より古いバージョンが必要っぽい。
- ビルド時に実際にクラスパスに追加されているのは 4.6.1 なので、Dagger が使おうとするメソッドがなくてビルドエラーになる。
解決策
Workaround
とりあえずの回避策としては、IntelliJ IDEA 2016.3 のディレクトリの中の lib/ecj-4.6.1.jar を削除しちゃうこと。
根本的な修正
Java コンパイラとして 「Eclipse」 が選択されているときのみ Eclipse Java Compiler の JAR ファイルをクラスパスに追加するよう変更されるらしい。 バージョン 2016.3.1 に含まれる予定とのこと。
(Eclipse Java Compiler の JAR がクラスパスに追加されるのは、IntelliJ IDEA の Java コンパイラとして 「Eclipse」 を選択したとき (設定の 「Build, Execution, Deployment」 → 「Compiler」 → 「Java Compiler」 で選択できる) 用ってことなのかな?)
関連
- IntelliJ IDEA で Dagger を使う方法について前に書いた : IntelliJ IDEA / Gradle 環境の Java プロジェクトで Dagger 2 (Google Dagger) を使う方法メモ