web-dev-qa-db-ja.com

dagger2.0を使用するようにIntelliJ / gradleを構成するにはどうすればよいですか

Gradleプロジェクトがあり、その中でdagger2.0を使用したいと思います。 IntelliJとgradleを構成してファイルを生成し、IntelliJにそれらを検出させる方法がわかりませんか?

私のbuild.gradleファイルは次のようになります:

apply plugin: 'Java'
apply plugin: 'idea'

version = '1.0'

repositories {
    mavenCentral()
    maven {
        url "https://oss.sonatype.org/content/repositories/snapshots"
    }
}

dependencies {
    compile 'org.slf4j:slf4j-api:1.7.12'
    compile 'org.slf4j:slf4j-simple:1.7.12'
    compile 'commons-configuration:commons-configuration:1.10'
    compile 'commons-collections:commons-collections:3.2.1'
    compile 'com.google.dagger:dagger:2.0'
    compile 'com.google.dagger:dagger-compiler:2.0:jar-with-dependencies'
    compile 'com.pi4j:pi4j-distribution:1.1-SNAPSHOT'
}

私のアプリケーションのビルドディレクトリには、Daggerが作成するコンポーネントであるファイルDaggerXmlConfigurationComponentが存在します。しかし、クラスが見つからないため、IntelliJでは使用できません。

これはAndroidアプリケーションではなく、RaspberryPi用のアプリケーションです。

26

IntelliJの注釈処理を手動で有効にする必要があります。[設定...]→[ビルド、実行、展開]→[コンパイラ]→[注釈プロセッサ]で、[注釈処理を有効にする]と[プロジェクトクラスパスからプロセッサを取得する]をオンにします。

16
robert_difalco

私は解決策を見つけました。

https://github.com/tbroyer/gradle-apt-plugin

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "net.ltgt.gradle:gradle-apt-plugin:0.3"
  }
}

apply plugin: "net.ltgt.apt"

dependecies {
  apt 'com.google.dagger:dagger-compiler:2.0.1'
  compile 'com.google.dagger:dagger:2.0.1'
}

さらに、Intellijを使用している場合は、次の構成をお勧めします。

IntelliJでGradle統合を使用する場合IDEAただし、アイデアタスクではなく、手動で注釈処理を有効にする必要があります:[設定...]→[ビルド、実行、展開]→[コンパイラ]→[注釈プロセッサ]、 [アノテーション処理を有効にする]と[プロジェクトのクラスパスからプロセッサを取得する]をオンにします。Gradleの動作と生成されたファイルの動作を模倣するために、本番ディレクトリとテストソースディレクトリをbuild/generate/source/apt/mainおよびbuild/generate/source/apt/testに構成できます。モジュールコンテンツルート。ビルドディレクトリ全体からExcludeを削除し、generated/source/apt/mainディレクトリをソースとしてマークする必要もありました。

8
Abdel

私もプラグインを動作させることができなかったので、Stefanの応答に基づいて、次のように動作しましたが、迷惑なことにIntelliJは、以前は存在しなかったグループモジュールを作成しているようです。何がこれを引き起こしているのか誰かが何か考えを持っているなら、私は本当にこれを修正したいと思います。

apply plugin: 'Java'
apply plugin: 'idea'

configurations {
    compileDagger
}

def genPath = new File(buildDir,"generated/source/apt/main" )

task createGenPath << {
    if(!genPath.exists()){
        genPath.mkdirs()
    }
}

compileJava.dependsOn(createGenPath)

compileJava {
    source += genPath
    classpath += configurations.compileDagger
    options.compilerArgs += ['-s', genPath]
}

idea.module {
    sourceDirs += genPath
}

dependencies {
    compileDagger "com.google.dagger:dagger-compiler:${dagger2Version}"
    compile "com.google.dagger:dagger:${dagger2Version}"
}
3
John Howard

私が知っている最も簡単な方法は、 apt-ideaプラグイン を使用することです。

build.gradleファイルでプラグインをアクティブ化するだけです。

plugins {
    id 'Java'
    id 'net.ltgt.apt-idea' version "0.15"
}

次に、注釈プロセッサをannotationProcessor構成に追加します。

final DAGGER_VER = '2.16'
dependencies {
    implementation "com.google.dagger:dagger:${DAGGER_VER}"
    annotationProcessor"com.google.dagger:dagger-compiler:${DAGGER_VER}"
}

GitHubで非常に単純なテストプロジェクトを作成しました: ex.dagger
(IntelliJ 2018.1.4、Gradle 4.7を使用)

3
TmTron

私は次の解決策を完成させました(そしてそれは送信されたすべての回答の中で最も単純なもののようです):

apply plugin: 'Java'
apply plugin: 'idea'

def generatedMain = new File(buildDir, "generated/main")

compileJava {
    doFirst {
        generatedMain.mkdirs()
    }
    options.compilerArgs += ['-s', generatedMain]
}
idea.module.sourceDirs += generatedMain

dependencies {
    compileOnly 'com.google.dagger:dagger-compiler:2.8'
    compile 'com.google.dagger:dagger:2.8'
}
2
Tomasz Gawel

私の場合、問題はIDEA短剣で生成されたファイル用に別のモジュールを作成することでした。File -> Project Structure -> Modulesに移動し、projectname_daggerモジュールを削除する必要がありました(赤をクリックして)マイナス)、生成されたソースフォルダをprojectname_mainをクリックして選択し、Add Content Rootモジュールに追加します。

何らかの理由で、Daggerのファイルを削除し、プロジェクト内の重複ファイルに関するエラーが発生したため、IDEA再生成する必要がありました。

これで機能し、アノテーションプロセッサがオフになっているイベント(Androidプロジェクト)では主に重要である必要があると思います)。

1
Gregor Petrin

既存のプラグインに問題があったので、build.gradleに以下を追加しました。

def daggerVersion = "2.4"

// APT >>
def genPath = new File(buildDir,"generated/Java/APT" )

task createGenPath << {
    if(!genPath.exists()){
        genPath.mkdirs()
    }
}
compileJava.dependsOn(createGenPath)

compileJava {
     options.compilerArgs << '-s' << genPath
}
// APT <<


dependencies {
    compile "com.google.dagger:dagger:$daggerVersion"
    compile "com.google.dagger:dagger-compiler:$daggerVersion"
}

// APT IDEA >>
idea.module {
    sourceDirs += genPath
    // maybe add to generatedSourceDirs
    iml {
        withXml {
            File ideaCompilerXml = project.file('.idea/compiler.xml')
            if (ideaCompilerXml.isFile()) {
                Node parsedProjectXml = (new XmlParser()).parse(ideaCompilerXml)
                updateIdeaCompilerConfiguration(parsedProjectXml)
                ideaCompilerXml.withWriter { writer ->
                    XmlNodePrinter nodePrinter = new XmlNodePrinter(new PrintWriter(writer))
                    nodePrinter.setPreserveWhitespace(true)
                    nodePrinter.print(parsedProjectXml)
                }
            }
        }
    }
}

static void updateIdeaCompilerConfiguration( Node projectConfiguration) { //actually resets APT
    Object compilerConfiguration = projectConfiguration.component.find { it.@name == 'CompilerConfiguration' }
    compilerConfiguration.annotationProcessing.replaceNode{
        annotationProcessing() {
            profile(default: 'true', name: 'Default', enabled: 'true') {
                sourceOutputDir(name: '')
                sourceTestOutputDir(name: '')
                outputRelativeToContentRoot(value: 'true')
                processorPath(useClasspath: 'true')
            }
        }
    }
}
// APT IDEA <<
1
Stefan K.

Net.ltgt.aptバージョン以降0.11(2018年2月)プラグインを適用するだけですnet.ltgt.apt-ideaからbuild.gradle

plugins {
    id "net.ltgt.apt-idea" version "0.18"
}

apply plugin: 'idea'
apply plugin: 'Java'

dependencies {
    compile             "com.google.dagger:dagger:2.17"
    annotationProcessor "com.google.dagger:dagger-compiler:2.17"
}
0
Malt