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();