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();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)