我正在尝试使用gradle执行以下任务的命令:
task stopServer(dependsOn: war, type: Exec) << {
commandLine 'pkill -9 tomcat'
}
当我运行它时,我收到以下错误:
* What went wrong:
Execution failed for task ':stopServer'.
> execCommand == null!
当我的任务是这样的时候:
task stopServer(dependsOn: war) << {
exec {
commandLine 'pkill -9 tomcat'
}
}
我收到此错误:
* What went wrong:
Execution failed for task ':stopServer'.
> A problem occurred starting process 'command 'pkill -9 tomcat''
你能告诉我每种方法在哪里出错吗?
如果上述两种方式都不是正确的执行方式,那么请以示例的方式指明实现方式。
答案 0 :(得分:21)
我相信你正在寻找这个:
task stopServer(dependsOn: war, type: Exec) {
commandLine "pkill", " -9", "tomcat"
}
主要区别非常微妙 - 我刚刚删除了两个字符。 <<
已从任务定义中消失。另一个区别是commandLine
期望可执行文件与其参数分开传递。
我删除了<<
,因为gradle中有一个重要的想法:the build lifecycle。有配置和执行阶段(这不是全部,但足以解释这一点)。
<<
就像在说doLast
一样 - 它会将您传递的闭包添加到此任务的操作结束(执行阶段)。所以这意味着在这里尝试执行命令就像普通(毕竟它是一个Exec
对象),只有然后,一旦执行,它会调用你的块 - 阻止设置commandLine
。因此,当它正在执行时,execCommand
确实为空,并且直到您的块运行。这是你问题的核心。
没有<<
(也称为左移),同一个块在配置阶段运行。因此exec命令在运行之前就已经设置好了,它可以工作。
答案 1 :(得分:3)
如果您希望从命令行运行但不希望在Android Studio中作为构建的一部分运行,那么这是另一个适用于同一错误的解决方案。
这将始终运行“myExecTask”的配置,但只有在通过“gradle myExecTask”显式运行时才会执行doMyExecTask
/**
* Actually run exec task in doLast phase
*/
task doMyExecTask << {
def hasProperties = project.hasProperty('SOME_PROPERTY');
if (hasProperties) {
myExecTask.commandLine "echo", "$SOME_PROPERTY"
} else {
println "ERROR: Unable to run task. Missing properties."
}
}
/**
* Configure exec task, this always runs
*/
task myExecTask(type: Exec) {
dependsOn doMyExecTask
workingDir 'path/to/executable'
}