Передача пути к зависимости Gradle компилятору Java

Я играю с Checker Framework, и его процессор аннотаций требует, чтобы ему был передан путь к банке "аннотированный JDK", чтобы он мог добавлять аннотации типов к классам 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()}"]
}

Но я думаю, что я не делаю это надлежащим образом, похоже на хак, на самом деле.

Кто-нибудь знает, как я могу улучшить это?

1 ответ

Решение

Вот как я это использую:

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-файлы в формате classpath естественным способом Gradle, используя ${configurations.checker.asPath}

compile configurations.checker.dependencies позволяет повторно использовать банки проверки в пути к классам компиляции без повторяющихся строк.

Другие вопросы по тегам