ProcessBuilder

当我们直接使用以下命令行时,会报错 CreateProcess error=2, 系统找不到指定的文件

ProcessBuilder pb = new ProcessBuilder("mvn -version");

乍一看,以为是mvn没在环境变量中,在cmd中执行了一把没问题。
原因:在代码中执行java命令时,依赖当前主应用的运行环境和进程,因此需要调用cmd命令重新为应用自己的进程开辟运行环境。
同时"cmd /c" 和真正要执行的命令,不能有空格,需要多个参数的形式存在。

ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "mvn -version");

同时,防止启动一个进程并且尝试读取它的错误流时,如果你没有正确地处理这些流,可能会导致程序挂起。如果错误流中积累了太多的输出而不被消费,那么进程可能会因为缓冲区满而被阻塞。为了避免这个问题,并确保你的程序能够顺利继续运行,你需要在单独的线程中读取输入流和错误流。

ProcessBuilder pb = new ProcessBuilder(/* your command */);
Process process = pb.start();

// 处理标准输出
Thread stdoutThread = new Thread(() -> {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
        reader.lines().forEach(System.out::println);
    } catch (IOException e) {
        e.printStackTrace();
    }
});

// 处理错误输出
Thread stderrThread = new Thread(() -> {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
        reader.lines().forEach(System.err::println);
    } catch (IOException e) {
        e.printStackTrace();
    }
});

stdoutThread.start();
stderrThread.start();

// 等待进程以及流的线程结束
stdoutThread.join();
stderrThread.join();
int exitValue = process.waitFor();
posted on 2024-04-05 16:36  zhaoqiang1980  阅读(111)  评论(0编辑  收藏  举报