【问题标题】:executing two commands with process builder使用进程生成器执行两个命令
【发布时间】:2013-06-20 14:18:01
【问题描述】:

我正在尝试编写一个从命令提示符编译另一个 java 文件的程序。但是,我遇到了问题。此时,它正在成功执行编译 Mocha.java 的第一部分。但是,我希望它也执行该文件并显示它的输出。它什么也不显示。有什么建议吗?

    pb = new ProcessBuilder("javac","Mocha.java");
    try {
        Process shell = pb.start();
        OutputStream shellOut = shell.getOutputStream();
        shellOut.write("java Mocha".getBytes());
        shellOut.close();
        InputStream shellIn = shell.getInputStream();
        String response = IOUtils.toString(shellIn, "UTF-8");
        System.out.println(response);
        shellIn.close();
        shell.destroy();
    } catch (IOException ex) {
        System.out.println("failed");
    }

注意:

我也试着让所有的论点都像这样:

pb = new ProcessBuilder("javac","Mocha.java","&&","java","Mocha");

但这不仅不起作用,甚至没有像上面那样编译 Mocha.java。

谢谢!

编辑:

所以我把它改成了两个进程。现在工作得很好,伙计们!对于任何有兴趣的人:

    pb = new ProcessBuilder("javac","Mocha.java");
    try {
        Process shell = pb.start();
        int error = shell.waitFor();
        shell.destroy();
        if (error == 0)
        {
            pb = new ProcessBuilder("java","Mocha");
            shell = pb.start();
            InputStream shellIn = shell.getInputStream();
            String response = IOUtils.toString(shellIn, "UTF-8");
            System.out.println(response);
            shellIn.close();
            shell.destroy();
        }
    } catch (IOException ex) {
        System.out.println("failed");
    } catch (InterruptedException ex) {
    }

【问题讨论】:

  • 注意:你应该至少在捕捉InterruptedException时做Thread.currentThread().interrupt()
  • 我很感激,我没有想到。

标签: java process processbuilder


【解决方案1】:

这很正常:两个命令意味着两个进程。你需要两个ProcessBuilders,并在执行第二个之前检查第一个进程的返回值。

这个语法:

new ProcessBuilder("javac","Mocha.java","&&","java","Mocha");

不起作用。 && 是一个逻辑 shell 运算符,javac 命令不理解它。直接在 Java 中执行您的处理逻辑:

if (p1.waitFor() == 0) // compile succeeded
    // initiate second process

【讨论】:

  • 知道了,没关系。我认为 waitFor 方法不应该返回零。
  • @phileaton 好吧,它返回进程调用的命令的退出代码(Javadoc 说);)
【解决方案2】:

上述语法适用于 shell,不适用于 java ProcessBuilder。

选项一是启动 shell 并执行 shell 命令。另一种是调用 ProcessBuilder 两次。一个用于 javac 另一个用于 java

【讨论】:

  • 启动shell并执行shell命令是什么意思?在Java中有另一种方法可以做到这一点吗?从我所看到的一切来看,ProcessBuilder 是唯一可以接受(未弃用)的方法吗?
  • (但有两个进程也很有意义。)
  • @phileaton 他的意思是使用 ProcessBuilder 来构建一个 shell 进程而不是 javac 进程,然后在你尝试的时候在 shell 中执行 javac (但你很困惑,因为你忘记了 shell 本身一个进程,而不是什么神奇的东西,而且 ProcessBuilder 实际上并没有启动一个 shell 进程,只是 javac 进程)。
  • 你的意思是(例如在 Windows 上)有一个现有的批处理文件来编译和执行程序,然后只是调用它?
猜你喜欢
  • 2022-07-08
  • 2017-06-19
  • 2020-01-20
  • 2010-10-01
  • 2014-10-08
  • 2014-06-22
  • 1970-01-01
  • 2022-10-19
  • 2020-10-18
相关资源
最近更新 更多