Dagger 1.2.2、Gradle 2.4、Eclipse 4.5.0 Mars 的注释处理失败

Annotation processing fails with Dagger 1.2.2, Gradle 2.4, Eclipse 4.5.0 Mars

Dagger 1.2.2,Gradle 2.4,Eclipse 4.5.0 Mars on OSX 10.9.5.

在 Eclipse 中尝试 运行 JUnit 测试失败:"Please ensure that code generation was run for this module."

这是 Eclipse 中的一个 Gradle 项目,版本如上。

JUnit 从命令行 ("./gradlew clean test") 成功测试 运行。

项目Properties:JavaCompiler:Annotation处理显示:所有复选框都已选中。生成的代码转到 .apt_generated。未指定处理器选项。

项目Properties:JavaCompiler:AnnotationProcessing:Factory路径显示:dagger-compiler-1.2.2.jar存在并检查,javawriter-2.5.0存在并检查, dagger-1.2.2.jar 存在并已检查。

org.eclipse.jst.ws.annotations.core 存在但未检查(检查它和重建似乎没有任何区别)。

"checked" jar 都是从我的 ~/.gradle/caches 目录中获取的。

.apt_generated 目录中没有任何内容(据我所知,生成的 class 文件应该出现在那里;我从未见过。)

想法? [编辑:添加了缺失的单词 "line"]

这里的另一位开发者知道这个问题的答案:

打开使用 Dagger 的项目的属性(使用项目上下文菜单,而不是主菜单)。

转到Java编译器:注释处理

取消选中启用注释处理复选框。

单击应用。系统会提示您重建整个项目;是的。

重新选中启用注释处理复选框。申请。重建项目。

生成的 类 现在应该出现在 .apt_generated.

我不知道这可能如何与项目上的 自动构建 设置交互,但我认为将其称为 Eclipse 中的错误是安全的。我将看到有关针对 Eclipse 提交错误的信息。

要从 gradle 脚本和多项目 gradle 项目中的所有项目自动解决此问题,您可以这样做。

  1. 定义一个eclipse.gradle文件以包含基于gradle eclipse插件
  2. 的以下配置
//generate eclipse .project, .classpath, .factorypath files
//References: https://github.com/mkarneim/pojobuilder/wiki/Enabling-PojoBuilder-for-Eclipse-Using-Gradle
apply plugin: 'eclipse'

ext { 
    eclipseAptFolder = '.apt_generated'
    eclipseSettingsDir = file('.settings')
}

configurations {
    codeGeneration
}    

dependencies {
    codeGeneration 'com.squareup.dagger:dagger-compiler:1.2.2'
    compile 'com.squareup.dagger:dagger:1.2.2'
}
compileJava.classpath += configurations.codeGeneration

eclipse {
    jdt.file.withProperties { 
        it['org.eclipse.jdt.core.compiler.processAnnotations'] = 'enabled'
    }
}

tasks.eclipseJdt {
    doFirst {
        def aptPrefs = file("${eclipseSettingsDir}/org.eclipse.jdt.apt.core.prefs")
        aptPrefs.parentFile.mkdirs()

        aptPrefs.text = """\
    eclipse.preferences.version=1
    org.eclipse.jdt.apt.aptEnabled=true
    org.eclipse.jdt.apt.genSrcDir=${eclipseAptFolder}
    org.eclipse.jdt.apt.reconcileEnabled=true
    """.stripIndent()

        file('.factorypath').withWriter {
            new groovy.xml.MarkupBuilder(it).'factorypath' {
                project.configurations.codeGeneration.each { dep->
                    factorypathentry(
                        kind:'EXTJAR',
                        id:dep.absolutePath,
                        enabled:true,
                        runInBatchMode:false
                    )
                }
            }
        }
    }
}
  1. 将 eclipse.gradle 文件应用于您的所有项目。以下是我在根项目中的做法:
allprojects {
    apply plugin: 'java'    
    apply from: rootProject.projectDir.toString() + '/eclipse.gradle'    
}
  1. 运行 eclipseJdt 任务 (gradele eclipseJdt) 并生成 .factorypath eclipse 文件,其中包含 eclipse 使用 Dagger 编译器作为注释处理器所需的所有配置
  2. 在 eclipse 中导入或刷新项目,然后继续工作:-)