使用Java Runtime执行命令

时间:2016-06-03 14:47:16

标签: java process runtime

我成功使用AutoIt执行命令,但我想我可以通过Runtime获得更稳定的实现。这样我知道命令将始终执行,并且不会被中断异常和其他随机废话抛出。有什么关于Runtime的东西,我不知道哪些不允许连续执行命令?它是否没有以前命令输出的内存,即它是否在持久命令行中运行?

以下命令导航到文件夹并执行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);
}

2 个答案:

答案 0 :(得分:2)

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

另请阅读Javadoc。对于Runtime.exec,它表示"在单独的进程中执行指定的字符串命令。"

答案 1 :(得分:1)

一些事情。

  1. 您应该使用ProcessProcessBuilder代替。
  2. 必须根据参数对命令进行拆分和标记。
  3. 你写的方式,这两个命令不会在同一个过程中执行。
  4. 幸运的是,ProcessBuilder支持更改命令的工作目录。
  5. 举个例子:

    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的功能通过指定多个构建目标来使它们全部运行。