gpt4 book ai didi

java - "adb start-server",Java,Gradle 和 apache-commons-exec : how to make it right?

转载 作者:行者123 更新时间:2023-12-01 14:24:25 25 4
gpt4 key购买 nike

当我尝试从 Java 中作为外部进程运行 android start-server 时,我遇到了各种问题。 Java是由Gradle调用的。让我向您描述一下各种场景下到底发生了什么:

环境

  • Windows 7 X64
  • Java 7
  • commons-exec-1.1
  • Gradle 1.6
  • Android API 17
  • IntelliJ IDEA 12.1.4 社区版

假设
adb 守护进程被终止,并将在调用 adb start-server 时启动。

案例1

这段代码:

DefaultExecutor executor = new org.apache.commons.exec.DefaultExecutor();
executor.execute(org.apache.commons.exec.CommandLine.parse("adb start-server"));
log.info("Checkpoint!");

当从应用程序插件的 Gradle run 任务运行时,将显示启动服务器输出,即:

* daemon not running. starting it now on port 5037 *
* daemon started successfully *

然后它就会挂起,即“检查点!”永远不会被记录。手动终止 adb.exe 进程将导致代码继续执行。

问题 1

为什么这个调用会阻塞?当从终端运行 adb start-server 命令时,几秒钟后控制权返回到终端,那么为什么代码中没有发生这种情况呢?

案例2

如果我像这样直接使用 Java 运行时:

Runtime.getRuntime().exec(new String[]{"adb", "start-server"});
log.info("Checkpoint!");
System.exit(0);

如果像以前一样从 Gradle 调用,则“检查点!”将被记录。但是,执行将在 System.exit(0) 上挂起。手动终止 adb.exe 将再次使 Gradle 调用完成。

在这种情况下,不会显示 adb start-server 的输出。

有趣的是,当我使用模仿 Gradle 的build设置而不是 Gradle 从 IntelliJ IDEA 运行应用程序时,一切正常并且应用程序正确完成。

问题 2

为什么 Gradle 在 System.exit(0) 上挂起,而 IntelliJ 却没有?这是否与以下事实有关:Gradle 本身是一个内部调用 Java 的进程,而在 IntelliJ 中,Java 会立即被调用而无需任何间接?为什么它很重要?

问题 3

最终,我希望能够从 Gradle 运行它,而不会出现任何形式的挂起。记录 adb start-server 的输出将是一个额外的好处。我将非常感谢任何有关如何执行此操作的提示。

最佳答案

如果我回答了错误的问题,请原谅我,但如果我想从 gradle 启动一个服务器(我们正在为 tomcat、sonicMQ、ApacheDS 和 EnterpriseDB 执行此操作),我会从 gradle Exec 任务开始,并且仅如果还不够,请尝试其他方法。

task startADB(type: Exec) {
commandLine 'adb', 'start-server'
}

不幸的是,我无法回答您有关各种代码挂起的任何问题,因为我不知道!我只知道如果我想从 gradle 启动服务器,我就会这样做。事实上我就是这么做的。另一个稍微复杂一点的选项是使用 the tanuki wrapper或类似的东西。您仍然可以从 gradle 启动和停止它,但您可以获得一些高级功能。

关于java - "adb start-server",Java,Gradle 和 apache-commons-exec : how to make it right?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17282081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com