Передача пути к зависимости 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
позволяет повторно использовать банки проверки в пути к классам компиляции без повторяющихся строк.