在 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 错误),它不会打印任何错误消息并构建成功,这是误导性的。
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 用户指南部分。
build.dependsOn GenerateJniHeaders
应替换为 jar.dependsOn GenerateJniHeaders
classes.finalizedBy
根本不需要。请注意,finalizedBy
通常用于清理,因为即使任务失败它也会执行。
我是 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 错误),它不会打印任何错误消息并构建成功,这是误导性的。
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 用户指南部分。
build.dependsOn GenerateJniHeaders
应替换为jar.dependsOn GenerateJniHeaders
classes.finalizedBy
根本不需要。请注意,finalizedBy
通常用于清理,因为即使任务失败它也会执行。