2014-11-23 243 views
8

我想用下面的任务gradle这个执行命令:使用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'' 

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

如果上述两者都不是正确的执行方式,那么请用一个例子来说明可能的做法。

+1

运行时,这并不真正适合我的答案的一部分,但我真的不要以为你想'pkill java'。这会杀死任何Java进程,包括你的IDE,并可能会自己加入。 – 2014-11-23 17:43:05

+0

我把它改成了'tomcat' – 2014-11-23 17:57:05

+0

为了防止任何人仍然面临问题,我已经改变了dx命令,我面临的问题包括像下面的'.bat',它开始工作。 'commandLine'sdk/dx。蝙蝠'--dex' – Guna 2016-08-19 10:21:17

回答

16

我相信你正在寻找这样的:

task stopServer(dependsOn: war, type: Exec) { 
    commandLine "pkill", " -9", "java" 
} 

的主要区别是很微妙 - 我只是删除两个字符。 <<已从任务定义中消失。另一个区别是commandLine预计可执行文件将从其参数分开传递。

我删除了<<,因为在gradle中有一个重要的想法:the build lifecycle。有配置和执行阶段(这不是全部,但足以解释这一点)。

<<好像是说doLast - 它增加了你传递给操作(在执行阶段)这个任务结束时关闭。因此,这意味着在这里,它会尝试和执行像正常的命令(它是一个Exec对象,毕竟),只有然后,一旦它执行时,它会打电话给你块 - 块设置commandLine。所以当它执行时,execCommand确实是空的,直到你的块运行。这是你的问题的核心。

如果没有<<(也称为左移),则该相同块在配置阶段期间运行。所以exec命令在运行之前就被设置好了,并且它可以工作。

+0

我试过你的解决方案,但没有运气,我得到这个错误'>一个问题发生在启动过程'命令'pkill -9 java'' – 2014-11-23 17:48:04

+2

在commandLine语法中还有一个错误。参数必须与可执行文件分开。我更新了编辑。 – 2014-11-23 17:49:12

+0

您的解决方案适用于'commandLine'catalina.sh','run'',但不适用于'commandLine'pkill','-9','tomcat''。有什么理由? – 2014-11-23 18:05:51

3

这里是另一种解决办法,如果你有,你要从命令行运行,但不希望Android Studio中作为构建的一部分来运行一个独立的exec任务相同的错误效果很好。

这将始终运行“myExecTask”的配置,但将只执行doMyExecTask在明确通过“gradle这个myExecTask”

/** 
* 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' 
}