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

use*_*095 10 java java-native-interface groovy gradle

我很擅长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
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我觉得它有点难看.我怎样才能改进它?我感谢任何建议,特别是那些帮我删除硬编码的变量的建议.我还想使这个任务更通用 - 现在它只为主类生成JNI头,但我想为所有java文件运行它.此外,当此任务失败时(例如,类路径错误),它不会打印任何错误消息并构建成功,这会产生误导.

Amn*_*hot 14

  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
    }
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,这样一来,此任务中的所有内容都是配置而不是操作(如果您不熟悉Gradle的构建生命周期,那么建议的阅读将在用户指南的部分中进行.

  2. build.dependsOn GenerateJniHeaders 应该被替换 jar.dependsOn GenerateJniHeaders

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