在 gradle 中定义 javah 任务的最佳方式

Best way to define javah task in gradle

我是 gradle 和 groovy 的新手。这是我生成 JNI headers:

的任务
apply plugin: 'java'
apply plugin: 'application'

mainClassName = "com.my.example.HelloG"

task GenerateJniHeaders(dependsOn: 'classes') << {
    def classpath = "build/classes/main"
    def nativeIncludes = "src/native/include"
    "javah -d ${nativeIncludes} -classpath ${classpath} ${mainClassName}".execute()
}
classes.finalizedBy GenerateJniHeaders
build.dependsOn GenerateJniHeaders

还可以,就是感觉有点丑。我该如何改进它?我感谢任何建议,尤其是那些帮助我删除我硬编码的变量的建议。我还想让这个任务更通用——现在它只为主要 class 生成 JNI header,但我想为所有 java 文件生成 运行。 此外,当此任务失败时(例如 classpath 错误),它不会打印任何错误消息并构建成功,这是误导性的。

  1. Gradle 有一个类型为 Exec 的任务类型和一个命令行 属性 所以它会更多适合使用它:

    task generateJniHeaders(type:Exec) {
        def classpath = sourceSets.main.output.classesDir
        def nativeIncludes = "src/native/include"                     
        commandLine "javah", "-d", nativeIncludes, "-classpath", classpath, "$mainClassName"
    
        dependsOn classes
    }
    

    请注意,通过这种方式,此任务中的所有内容都是配置而不是操作(如果您不熟悉 Gradle 的构建生命周期,那么推荐阅读 this 用户指南部分。

  2. build.dependsOn GenerateJniHeaders 应替换为 jar.dependsOn GenerateJniHeaders

  3. classes.finalizedBy 根本不需要。请注意,finalizedBy 通常用于清理,因为即使任务失败它也会执行。