【问题标题】:Executing commands with Gradle?使用 Gradle 执行命令?
【发布时间】:2015-01-21 09:30:13
【问题描述】:

我正在尝试使用以下任务执行带有 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''

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

如果以上都不是正确的执行方式,请举例说明执行方式。

【问题讨论】:

  • 这并不适合我的回答,但我真的不认为你想pkill java。这将杀死任何 Java 进程,包括您的 IDE,并可能自行 gradle。
  • 我改成tomcat
  • 以防万一有人仍然遇到问题,我已将我面临的问题的 dx 命令更改为包含如下所示的“.bat”并开始工作。 commandLine 'sdk/dx.bat' --dex

标签: gradle build.gradle


【解决方案1】:

我相信您正在寻找这个:

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

主要区别非常细微 - 我只是删除了两个字符。 &lt;&lt; 已从任务定义中消失。另一个区别是commandLine 期望可执行文件与传递给它的参数分开传入。

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

&lt;&lt; 就像在说 doLast - 它会将您传递的闭包添加到此任务的操作(执行阶段)的末尾。所以这意味着在这里,它将尝试像正常一样执行命令(毕竟它是一个Exec 对象),并且只有然后,一旦它被执行,它会调用你的块 - 块设置commandLine。所以当它执行时,execCommand 真的是空的,直到你的块运行为止。这是您问题的核心。

没有&lt;&lt;(也称为左移),相同的块在配置阶段运行。所以 exec 命令在它运行之前就被设置好了,它就可以工作了。

【讨论】:

  • 我尝试了您的解决方案,但没有成功,我收到此错误&gt; A problem occurred starting process 'command 'pkill -9 java''
  • 命令行语法中还有另一个错误。参数必须与可执行文件分开。我更新了编辑。
  • 您的解决方案适用于例如commandLine 'catalina.sh', 'run',但不适用于commandLine 'pkill', '-9', 'tomcat'。有什么原因吗?
  • 如果一个有效而另一个无效,则很可能是您尝试运行的 shell 命令存在问题。尝试自己在 shell 中运行该命令,看看它是否有效。或者使用 --debug 或 --stacktrace 运行 gradle
  • 我必须说,这是一个很好的答案。到处搜索,但在此之前无法弄清楚。谢谢!
【解决方案2】:

如果您有一个独立的 exec 任务想要从命令行运行,但又不想在构建过程中在 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'
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2023-03-26
    • 2019-10-20
    • 1970-01-01
    • 2013-10-07
    相关资源
    最近更新 更多