将 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。
我正在使用 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。