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

在gradle中定义javah任务的最佳方法,java,groovy,gradle,java-native-interface,Java,Groovy,Gradle,Java Native Interface,我对gradle和groovy还比较陌生。以下是生成JNI头的任务: apply plugin: 'java' apply plugin: 'application' mainClassName = "com.my.example.HelloG" task GenerateJniHeaders(dependsOn: 'classes') << { def classpath = "build/classes/main" def nativeIncludes = "

我对gradle和groovy还比较陌生。以下是生成JNI头的任务:

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
apply插件:“java”
应用插件:“应用程序”
mainClassName=“com.my.example.HelloG”
任务GenerateJniHeaders(dependsOn:'classes')
  • Gradle的任务类型为,具有命令行属性,因此更适合使用它:

    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的构建生命周期,建议阅读《用户指南》中的部分

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

  • 类。完全不需要finalizedBy
    。请注意,
    finalizedBy
    通常用于清理,因为即使任务失败,它也会执行


  • 我想这不是增量构建的最佳解决方案