如何在不使用`dependsOn`的情况下附加Gradle任务?

时间:2017-04-16 08:33:27

标签: java gradle groovy java-native-interface

我正在使用Gradle构建涉及本机库的Java项目。我定义了一个任务jniHeaders

jniHeaders.dependsOn classes

所以当我输入gradle jniHeaders时,它将编译Java类并生成JNI头。到目前为止一切都很好。

但我觉得输入gradle jniHeaders并不是很自然。 99%的情况下,如果您成功编译Java类,您也需要生成JNI标头。如果我能gradle classes编译Java类并在一个步骤中生成JNI头,那将是很好的。

换句话说,我想将任务jniHeaders添加到任务classes的末尾,但只有classes成功完成并且实际上做了一些工作。

想到了{p> classes.doLast,但我无法告诉它执行另一项任务。 classes.finalizedBy jniHeaders在某种程度上起作用,但无论classes的结果如何,都会生成JNI标头。我想我可以添加一些Groovy逻辑来获得我想要的确切行为,但我也怀疑必须有一种更简单的方法。

有人有什么建议吗?

2 个答案:

答案 0 :(得分:1)

将构建建模为任务图的重点是,它具有简单而强大的执行模型。我建议您创建一个函数compileJNIHeaders()并将其放在Gradle可以访问的位置(build.gradle本身以及buildSrc/src/main/groovy),这样您就可以轻松地开发和测试它。

此功能可以在最合适的步骤中执行:

  • classes.doFirst(如果标题是您自己的代码)
  • classes.doLast(如果标题用于依赖项目)
  • 输入任务compileJNIHeaders,该任务是您用于以部署格式打包项目的任务的依赖项

答案 1 :(得分:1)

您的问题分为两部分:

  1. 在成功编译java类之后添加任务jniHeaders以执行。
  2. 如果已完成任何工作,则仅执行jniHeaders任务。
  3. 由于classes任务是processResourcescompileJava的集合(请参阅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