2014-11-23 246 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' 
}