我正在使用Gradle构建涉及本机库的Java项目。我定义了一个任务jniHeaders
:
jniHeaders.dependsOn classes
所以当我输入gradle jniHeaders
时,它将编译Java类并生成JNI头。到目前为止一切都很好。
但我觉得输入gradle jniHeaders
并不是很自然。 99%的情况下,如果您成功编译Java类,您也需要生成JNI标头。如果我能gradle classes
编译Java类并在一个步骤中生成JNI头,那将是很好的。
换句话说,我想将任务jniHeaders
添加到任务classes
的末尾,但只有classes
成功完成并且实际上做了一些工作。
classes.doLast
,但我无法告诉它执行另一项任务。 classes.finalizedBy jniHeaders
在某种程度上起作用,但无论classes
的结果如何,都会生成JNI标头。我想我可以添加一些Groovy逻辑来获得我想要的确切行为,但我也怀疑必须有一种更简单的方法。
有人有什么建议吗?
答案 0 :(得分:1)
将构建建模为任务图的重点是,它具有简单而强大的执行模型。我建议您创建一个函数compileJNIHeaders()
并将其放在Gradle可以访问的位置(build.gradle
本身以及buildSrc/src/main/groovy
),这样您就可以轻松地开发和测试它。
此功能可以在最合适的步骤中执行:
classes.doFirst
(如果标题是您自己的代码)classes.doLast
(如果标题用于依赖项目)compileJNIHeaders
,该任务是您用于以部署格式打包项目的任务的依赖项答案 1 :(得分:1)
您的问题分为两部分:
jniHeaders
以执行。jniHeaders
任务。由于classes
任务是processResources
和compileJava
的集合(请参阅java plugin doc),我认为最好挂钩compileJava
任务。正如您自己发现的那样,这可以通过finalizedBy
来完成。此外,如果没有完成任务,您需要跳过任务,例如通过向onlyIf
任务添加jniHeaders
语句。
示例:
task jniHeaders {
onlyIf { !sourceSets.main.allJava.empty }
doLast {
println "GENERATE JNI HEADERS for $project.name"
}
}
compileJava.finalizedBy jniHeaders