0

私は 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()}"]
}

しかし、私はそれを適切な方法で行っていないと思います。本当にハックのようです。

これを改善する方法を知っている人はいますか?

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 を別の構成に入れると、クラスパス形式のすべての jar を自然な Gradle の方法で取得できます。${configurations.checker.asPath}

compile configurations.checker.dependencies重複行なしでクラスパスをコンパイルする際にチェッカー jar を再利用できます。

于 2015-10-21T22:02:55.070 に答える