我对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
它运作正常,但我觉得它有点难看。我怎样才能改进它?我感谢任何建议,特别是那些帮我删除硬编码的变量的建议。我还想使这个任务更通用 - 现在它只为主类生成JNI头,但我想为所有java文件运行它。 此外,当此任务失败时(例如,类路径错误),它不会打印任何错误消息并构建成功,这会产生误导。
答案 0 :(得分:14)
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 用户指南中的strong>部分。
build.dependsOn GenerateJniHeaders
应替换为jar.dependsOn GenerateJniHeaders
classes.finalizedBy
。请注意,finalizedBy
通常用于清理,即使任务失败也会执行。