Java执行CMD命令无响应且未生成目标文件,如何解决?
问题排查与解决步骤
1. 修正CMD命令格式
你当前的cmd命令缺少/c参数——这是CMD执行后续命令的必要参数,没有它CMD无法正确解析并运行JMeter指令。正确的命令格式应为:
String cmd = "cmd /c D:\\Programming\\JMeter\\apache-jmeter-5.5\\bin\\jmeter -n -t D:\\Programming\\JMeter\\apache-jmeter-5.5\\result\\example.jmx -l D:\\Programming\\JMeter\\apache-jmeter-5.5\\result\\example_jtl.jtl -e -o D:\\Programming\\JMeter\\apache-jmeter-5.5\\result\\example_visual";
2. 读取进程输出流与错误流
你的代码仅获取了错误流但未读取内容,这会导致进程因输出缓冲区满而阻塞,无法完成执行。必须读取这两个流,既能避免进程挂起,也能查看执行中的错误信息。修改后的代码如下:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class JMeterRunner { public static void main(String[] args) { try { System.out.println("begin cmd"); Runtime mt = Runtime.getRuntime(); String cmd = "cmd /c D:\\Programming\\JMeter\\apache-jmeter-5.5\\bin\\jmeter -n -t D:\\Programming\\JMeter\\apache-jmeter-5.5\\result\\example.jmx -l D:\\Programming\\JMeter\\apache-jmeter-5.5\\result\\example_jtl.jtl -e -o D:\\Programming\\JMeter\\apache-jmeter-5.5\\result\\example_visual"; Process pro = mt.exec(cmd); // 读取标准输出流 new Thread(() -> { try (BufferedReader reader = new BufferedReader(new InputStreamReader(pro.getInputStream()))) { String line; while ((line = reader.readLine()) != null) { System.out.println("JMeter输出: " + line); } } catch (IOException e) { e.printStackTrace(); } }).start(); // 读取错误输出流 new Thread(() -> { try (BufferedReader reader = new BufferedReader(new InputStreamReader(pro.getErrorStream()))) { String line; while ((line = reader.readLine()) != null) { System.err.println("JMeter错误: " + line); } } catch (IOException e) { e.printStackTrace(); } }).start(); int exitCode = pro.waitFor(); System.out.println("进程退出码: " + exitCode); } catch (IOException ioe) { ioe.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
3. 路径与权限检查
- 确认
example.jmx文件确实存在于指定路径,路径大小写需与实际文件完全一致。 - 确认输出目录
D:\\Programming\\JMeter\\apache-jmeter-5.5\\result\\有写入权限,Windows系统下避免放在Program Files等需管理员权限的目录,或直接以管理员身份运行Java程序。 - 先手动在CMD中执行JMeter命令,验证命令本身是否能生成文件:
D:\Programming\JMeter\apache-jmeter-5.5\bin\jmeter -n -t D:\Programming\JMeter\apache-jmeter-5.5\result\example.jmx -l D:\Programming\JMeter\apache-jmeter-5.5\result\example_jtl.jtl -e -o D:\Programming\JMeter\apache-jmeter-5.5\result\example_visual
如果手动执行也失败,说明是JMeter本身的问题,比如jmx文件损坏、JMeter环境配置错误等。
4. 清理已存在的输出目录
JMeter的-o参数要求输出目录必须不存在,若之前运行过命令生成了example_visual文件夹,需先手动删除后再重新执行代码。
内容的提问来源于stack exchange,提问作者王纾林
相关产品推荐
相关产品推荐

