私は Checker Framework で遊んでいますが、そのアノテーション プロセッサには、型アノテーションを JDK クラスに追加できるように、「アノテーション付き JDK」jar へのパスを渡す必要があります。
したがって、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()}"]
}
しかし、私はそれを適切な方法で行っていないと思います。本当にハックのようです。
これを改善する方法を知っている人はいますか?