将 Gradle 依赖项的路径传递给 Java 编译器

Passing the path to a Gradle dependency to the Java compiler

我正在使用 Checker Framework,它的注释处理器需要将 "annotated JDK" jar 的路径传递给它,以便它可以向 JDK [=42] 添加类型注释=].

所以,我需要 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()}"]
}

但我认为我没有以适当的方式进行操作,看起来真的很糟糕。

有人知道我可以如何改进吗?

我就是这么用的:

configurations {
    checker
}

dependencies {
    checker "org.checkerframework:checker:1.9.6"
    checker 'org.checkerframework:jdk8:1.9.6'
    compile configurations.checker.dependencies
}

allprojects {
    tasks.withType(JavaCompile).all { JavaCompile compile ->
        compile.options.debug = true
        compile.options.compilerArgs = [
                "-Xbootclasspath/p:${configurations.checker.asPath}",
                '-processor', 'org.checkerframework.checker.nullness.NullnessChecker',
                '-implicit:class',
                '-AprintErrorStack'
        ]
    }
}

说明:将 checker-framework 放入单独的配置中允许以自然的 Gradle 方式获取类路径格式的所有 jar,使用 ${configurations.checker.asPath}

compile configurations.checker.dependencies 允许在没有重复行的情况下在编译类路径中重复使用检查器 jar。