使用 Java 运行时执行命令

Executing commands using Java Runtime

我成功地使用 AutoIt 执行命令,但我认为我可以通过运行时获得更稳定的实现。这样我就知道命令将始终执行并且不会被中断异常和其他随机垃圾抛出。运行时有什么我不知道的东西不允许连续执行命令吗?它没有记忆以前命令的输出,即它不是在持久命令行中 运行 吗?

以下命令导航到文件夹并执行 Maven 脚本。我怎样才能让它发挥作用?如果后面还有 10 多个命令,它们会在同一个进程中执行吗?

sendCommand("cmd.exe cd homepath/plugins");
sendCommand("mvn archetype:generate -DarchetypeCatalog=file://homepath/.m2/repository");

private static void sendCommand(String text) throws IOException {
    Runtime.getRuntime().exec(text);
}

Runtime.exec() returns 一个流程实例。在此对象上调用 waitFor() 以等待它在 运行 下一个命令之前完成。您可以通过其 getInputStream()/getOutputStream() 方法与进程通信。

另请阅读 Javadoc。对于 Runtime.exec 它说 "Executes the specified string command in a separate process."

几件事。

  1. 您应该改用 Process and ProcessBuilder
  2. 必须根据参数拆分和标记命令。
  3. 按照你写的方式,这两个命令不会在同一个进程中执行。
  4. 幸运的是,ProcessBuilder无论如何都支持更改命令的工作目录。

举个例子:

sendCommand("homepath/plugins", "mvn", "archetype:generate", "-DarchetypeCatalog=file://homepath/.m2/repository");

private static void sendCommand(String workingDirectory, String... command) throws IOException {
    Process proc = new ProcessBuilder(command).directory(new File(workingDirectory)).start();
    int status = proc.waitFor();
    if (status != 0) {
        // Handle non-zero exit code, which means the command failed
    }
}

注意 a) 命令是如何拆分的,以及 b) 工作目录是如何传入并使用 ProcessBuilder.directory(File) 设置的。这将获得您想要的行为,但请注意,每个命令仍将是一个单独的进程,并且无法将它们与 Java 组合。您必须使用 Maven 的功能通过指定多个构建目标来立即将它们全部 运行。