如何在Java程序中执行jps -l命令并获取输出,解决找不到文件报错
解决方案
错误原因
- 系统找不到
jps命令的执行路径:Runtime执行外部命令时读取的环境变量PATH可能未包含JDK的bin目录,无法定位到jps.exe - 命令参数解析错误:直接将带空格的整串命令传入
exec()方法容易出现解析异常,部分写法中加入的start参数会新开独立窗口运行命令,当前进程无法捕获输出
可行实现方案
优先使用ProcessBuilder替代Runtime.exec(),兼容性和可控性更强,同时可以通过JDK自带的系统属性动态拼接jps的路径,避免写死路径的问题。
完整代码示例
import java.io.BufferedReader; import java.io.InputStreamReader; public class JpsExecutor { public static void main(String[] args) { try { // 动态拼接jps路径,适配不同JDK安装位置 String jpsPath = System.getProperty("java.home") + "/../bin/jps"; // Windows系统补全.exe后缀 String os = System.getProperty("os.name").toLowerCase(); if (os.contains("win")) { jpsPath += ".exe"; } // 数组形式传参避免空格解析错误 ProcessBuilder pb = new ProcessBuilder(jpsPath, "-l"); // 合并错误流到标准输出,避免缓冲区满导致进程阻塞 pb.redirectErrorStream(true); Process proc = pb.start(); // 读取命令输出 BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } // 等待命令执行完成,获取退出码 int exitCode = proc.waitFor(); System.out.println("命令执行完成,退出码:" + exitCode); reader.close(); proc.destroy(); } catch (Exception e) { e.printStackTrace(); } } }
注意事项
- 如果不使用动态拼接路径,也可以直接传入jps的绝对路径,比如
C:\\Program Files\\Java\\jdk1.8.0_301\\bin\\jps.exe,替换为本地实际的JDK路径即可 - 不要使用
cmd /c start或者powershell带启动新进程的参数,否则会导致输出无法捕获 - 必须读取进程的输出流,否则缓冲区满会导致进程一直卡住无法结束
内容的提问来源于stack exchange,提问作者Jayesh Pandey
相关产品推荐
相关产品推荐

