使用Gradle执行命令?

Ram*_*tra 15 gradle build.gradle

我正在尝试使用gradle执行以下任务的命令:

task stopServer(dependsOn: war, type: Exec) << {
    commandLine 'pkill -9 tomcat'
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到以下错误:

* What went wrong:
Execution failed for task ':stopServer'.
> execCommand == null!
Run Code Online (Sandbox Code Playgroud)

当我的任务是这样的:

task stopServer(dependsOn: war) << {
    exec {
        commandLine 'pkill -9 tomcat'
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

* What went wrong:
Execution failed for task ':stopServer'.
> A problem occurred starting process 'command 'pkill -9 tomcat''
Run Code Online (Sandbox Code Playgroud)

你能告诉我在这些方法中我哪里出错吗?

如果上述两种方法都不是正确的执行方式,那么请用一个例子来说明这样做的方法.

Pau*_*ips 22

我相信你在寻找这个:

task stopServer(dependsOn: war, type: Exec) {
     commandLine "pkill", " -9", "tomcat"
}
Run Code Online (Sandbox Code Playgroud)

主要区别非常微妙 - 我刚刚删除了两个字符.在<<从任务定义了.另一个区别是,commandLine期望可执行文件与其参数分开传递.

我删除了<<因为gradle中的一个重要想法:构建生命周期.有配置和执行阶段(这不是全部,但足以解释这一点).

<<就像说doLast- 它将您传递的闭包添加到此任务的操作(执行阶段)的末尾.所以这意味着在这里,它将尝试像普通一样执行命令(Exec毕竟它是一个对象),只有这样,一旦它被执行,它将调用你的块 - 块设置commandLine.因此,当它正在执行时,execCommand实际上是null,并且直到你的块运行.这是你问题的核心.

如果没有<<(也称为左移),则在配置阶段运行相同的块.因此exec命令在运行之前就会被设置,并且它可以工作.

  • commandLine语法中还有另一个错误.必须将参数与可执行文件分开.我更新了编辑. (2认同)