26

我有一个 gradle 项目,我想在其中使用 dagger 2.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'
}

在我的应用程序的构建目录中,该文件DaggerXmlConfigurationComponent存在,这是 Dagger 创建的组件。但我不能在 IntelliJ 中使用它,因为它找不到类。

这不是 Android 应用程序,而是 Raspberry Pi 的应用程序。

4

8 回答 8

17

您必须手动为 IntelliJ 启用注释处理:在 Settings... → Build, Execution, Deployment → Compiler → Annotation Processors 中,选中 Enable annotation processing 并从项目类路径获取处理器。

于 2015-09-29T20:42:29.413 回答
8

我找到了解决方案。

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 IDEA 中使用 Gradle 集成时,您必须手动启用注释处理,而不是使用想法任务:在 Settings... → Build, Execution, Deployment → Compiler → Annotation Processors 中,选中 Enable annotation processing 并从项目中获取处理器类路径。为了模仿 Gradle 行为和生成文件行为,您可以将生产和测试源目录分别配置为 build/generated/source/apt/main 和 build/generated/source/apt/test 并选择将生成的源相对于:模块内容根。我还必须从整个构建目录中删除 Exclude 并将生成的/source/apt/main 目录标记为源。

于 2015-11-10T14:41:01.193 回答
5

我知道的最简单的方法是使用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)

于 2018-05-27T10:57:46.193 回答
3

我也无法让任何插件工作,因此根据 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}"
}
于 2016-05-12T16:48:47.313 回答
2

我完成了以下解决方案(它似乎是所有已发送答案中最简单的一个):

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'
}
于 2017-01-23T20:51:33.810 回答
1

我在使用现有插件时遇到了问题,因此我将以下内容添加到我的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 <<
于 2016-05-04T19:02:04.133 回答
1

就我而言,问题是 IDEA 为 dagger 生成的文件创建了一个单独的模块。我必须去File -> Project Structure -> Modules并删除projectname_dagger模块(通过单击红色减号),然后projectname_main通过单击Add Content Root并选择将生成的源文件夹添加到我的模块中。

出于某种原因,我不得不删除 Dagger 的文件并让 IDEA 重新生成它们,因为我收到有关项目中重复文件的错误。

现在它可以工作了,关闭注释处理器的事件(我怀疑它们必须主要对 Android 项目很重要)。

于 2016-11-24T11:11:58.570 回答
0

自 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"
}
于 2018-10-21T09:51:50.940 回答