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 项目中的所有项目自动解决此问题,您可以这样做。
- 定义一个eclipse.gradle文件以包含基于gradle eclipse插件
的以下配置
//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
)
}
}
}
}
}
- 将 eclipse.gradle 文件应用于您的所有项目。以下是我在根项目中的做法:
allprojects {
apply plugin: 'java'
apply from: rootProject.projectDir.toString() + '/eclipse.gradle'
}
- 运行 eclipseJdt 任务 (gradele eclipseJdt) 并生成 .factorypath eclipse 文件,其中包含 eclipse 使用 Dagger 编译器作为注释处理器所需的所有配置
- 在 eclipse 中导入或刷新项目,然后继续工作:-)
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 项目中的所有项目自动解决此问题,您可以这样做。
- 定义一个eclipse.gradle文件以包含基于gradle eclipse插件 的以下配置
//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 ) } } } } }
- 将 eclipse.gradle 文件应用于您的所有项目。以下是我在根项目中的做法:
allprojects { apply plugin: 'java' apply from: rootProject.projectDir.toString() + '/eclipse.gradle' }
- 运行 eclipseJdt 任务 (gradele eclipseJdt) 并生成 .factorypath eclipse 文件,其中包含 eclipse 使用 Dagger 编译器作为注释处理器所需的所有配置
- 在 eclipse 中导入或刷新项目,然后继续工作:-)