Android プロジェクトで Dagger 2 を使う方法についてはいろいろ情報があるけど、Android じゃない Java プロジェクトの情報はあんまりなくて一筋縄ではいかなかったのでメモ。 もっといい方法があれば教えて欲しい。
概要
アノテーションプロセッシングの処理のために Gradle の net.ltgt.apt プラグイン を使う。 (このプラグインを使わない方法もあると思うけど試してない。) 基本はこのプラグインのドキュメントに書いてある通りで良い。
確認したバージョン
- IntelliJ IDEA 2016.2.5
- Gradle 2.13
- Dagger 2.6
- Gradle net.ltgt.apt プラグイン 0.9
詳細
単純に Gradle プロジェクトで使う場合
以下のような build.gradle を書けばよい。
plugins {
id 'java'
id "net.ltgt.apt" version "0.9"
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
def defaultEncoding = 'UTF-8'
tasks.withType(JavaCompile)*.options*.encoding = defaultEncoding
repositories {
mavenCentral()
}
dependencies {
compile 'com.google.dagger:dagger:2.6'
apt 'com.google.dagger:dagger-compiler:2.6'
// テストの方でも Dagger を使ってるならこれも必要。
testApt 'com.google.dagger:dagger-compiler:2.6'
}
IntelliJ IDEA で動かす場合
以下のことをすればうまく動く。 (net.ltgt.apt プラグインのドキュメントに書いてある通り。)
- Gradle idea プラグインを使用する。 (idea プラグインを使わない場合は追加の設定が必要。 後述する。)
- IntelliJ IDEA 2016.1 以降を使っている場合、プロジェクトを IntelliJ IDEA にインポートする際に 「Create separate module per source set」 のチェックを外すこと。
- 設定の 「Annotation Processors」 のページ (「Settings…」 → 「Build, Execution, Deployment」 → 「Compiler」 の中) で次のことを行う。
- 「Enable annotation processing」 にチェックを付ける。
- 「Obtain processors from project classpath」 を選択。
- Gradle 単体の挙動にあわせて、生成先ディレクトリを以下のように設定する。 (これをすることで生成された。)
- 「Store generated sources relative to」 を 「Module content root」 に。
- 「Production sources directory」 を 「build/generated/source/apt/main」 に。
- 「Test sources directory」 を 「build/generated/source/apt/test」 に。
Gradle の idea プラグインを適用しない場合
idea プラグインを適用しなくても動くのだけど、その場合は以下のような変更が必要だった。
- configuration は
apt
じゃなくてcompileOnly
を使わないとダメそう。- コンパイル時の依存に含めないでいいものだから本来は
apt
にすべきではあるのだけど。
- コンパイル時の依存に含めないでいいものだから本来は
- アノテーションプロセッシングの出力先ディレクトリを Java のソースフォルダとして追加しよう。
- そうしないと 「ビルドはできるのにソースコード上で Dagger により生成されたクラスが見つからない」 という状態になる。
- 「Project Structure…」 の 「Project Setting」 → 「Modules」 にて、ソースディレクトリにアノテーションプロセッシングの出力先ディレクトリを追加。
関連ページ
- IntelliJ IDEA 2016.2 Help :: Annotation Processors Support : IntelliJ IDEA のアノテーションプロセッシングサポートのヘルプページ。
- Stack Overflow の皆様。