0

我正在使用 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()}"]
}

但我认为我没有以适当的方式做这件事,看起来像一个黑客,真的。

任何人都知道我可以如何改进这一点?

4

1 回答 1

4

我就是这样使用它的:

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,而无需重复行。

于 2015-10-21T22:02:55.070 回答