我正在使用 Checker Framework,它的注释处理器需要将“带注释的 JDK”jar 的路径传递给它,以便它可以向 JDK 类添加类型注释。
所以,我需要 Gradle 做的是获取 jar 的路径并将其传递给 java 编译器。
很简单,通常,在 Gradle 中:
// tried to keep this property in the project.extensions but wouldn't work
final AtomicReference jarRef = new AtomicReference()
task resolveAnnotatedJdk << {
def jar = configurations.compile.resolve().find {
it.name == "jdk8-${checkerVersion}.jar"
}
logger.log LogLevel.ERROR, "Found annoated JDK at ${jar.absolutePath}"
jarRef.set jar.absolutePath
}
运行resolveAnnotatedJdk
任务有效!
问题是试图让它在compileJava
配置块内工作:
compileJava {
dependsOn << 'resolveAnnotatedJdk'
sourceCompatibility = 1.8
options.compilerArgs = ['-processor', 'org.checkerframework.checker.nullness.NullnessChecker',
"-Xbootclasspath/p:${jarRef.get()}"]
}
我相信,这不起作用,因为该compileJava
块是配置并在解决依赖关系之前运行。
我试过在一个runFirst
块中添加选项,它似乎工作:
compileJava {
dependsOn << 'resolveAnnotatedJdk'
sourceCompatibility = 1.8
}.doFirst {
println "Will compile with ${jarRef}"
options.compilerArgs = ['-processor', 'org.checkerframework.checker.nullness.NullnessChecker',
"-Xbootclasspath/p:${jarRef.get()}"]
}
但我认为我没有以适当的方式做这件事,看起来像一个黑客,真的。
任何人都知道我可以如何改进这一点?