如何通过 java 代码执行 "java" 命令?
how can I execute "java" command by java code?
我正在尝试通过代码运行 使用JADE 的多代理系统。
通常,我可以使用以下命令通过命令行 运行 jade 系统:
java jade.Boot -gui
通过更改项目属性并将 运行 配置指向 jade.Boot class.
,它也可以很好地使用 Netbeans IDE
我的问题是:我想通过 java 代码 运行 这个系统...比方说,当用户单击一个按钮时,据我所知,上面指定的这个命令应该使用以下代码工作:
Process p=null;
try {
p = Runtime.getRuntime().exec("java jade.Boot -gui;");
}
catch (IOException ex) {
Logger.getLogger(SimulationCreator.class.getName()).log(Level.SEVERE, null, ex);
}
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
String s;
try {
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
} catch (IOException ex) {
Logger.getLogger(SimulationCreator.class.getName()).log(Level.SEVERE, null, ex);
}
但是我什么也没得到,JADE 系统既没有运行宁也没有收到任何错误。
我错过了什么?
P.S.: 我正在研究 ubuntu 20.0.
P.S.: 运行通过“ps -aux”等代码执行其他命令非常有效!
您的问题可能是当前 运行 VM 的 PATH 与您使用的 shell(bash 等)和 CLASSPATH 的隐式传递之间的差异。检查 java 的位置 shell 中哪个 which java
有效并尝试在你的 exec
.
中使用
此外,当 运行 时您不会看到所有问题,因为您不会在访问输出流的同时访问错误流,更改为 ProcessBuilder 可以更轻松地调试,因为您可以重定向 out/err 流到文件。但是如果 JADE 运行了很长时间或者产生了很多输出,你应该在后台线程中使用 STDOUT+ERR。
在 jshell 中试试这个:
String[] cmd = new String[]{"java", "jade.Boot", "-gui"};
ProcessBuilder pb = new ProcessBuilder(cmd);
File fileOut = new File("stdout.log");
File fileErr = new File("stderr.log");
pb.redirectError(fileErr);
pb.redirectOutput(fileOut);
Process p = pb.start();
int rc = p.waitFor();
String stdout = Files.readString(fileOut.toPath());
String stderr = Files.readString(fileErr.toPath());
System.out.println("Exit : "+rc +' '+(rc == 0 ? "OK":"**** ERROR ****"));
System.out.println("STDOUT : "+stdout);
System.out.println("STDERR : "+stderr);
我正在尝试通过代码运行 使用JADE 的多代理系统。 通常,我可以使用以下命令通过命令行 运行 jade 系统:
java jade.Boot -gui
通过更改项目属性并将 运行 配置指向 jade.Boot class.
,它也可以很好地使用 Netbeans IDE我的问题是:我想通过 java 代码 运行 这个系统...比方说,当用户单击一个按钮时,据我所知,上面指定的这个命令应该使用以下代码工作:
Process p=null;
try {
p = Runtime.getRuntime().exec("java jade.Boot -gui;");
}
catch (IOException ex) {
Logger.getLogger(SimulationCreator.class.getName()).log(Level.SEVERE, null, ex);
}
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
String s;
try {
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
} catch (IOException ex) {
Logger.getLogger(SimulationCreator.class.getName()).log(Level.SEVERE, null, ex);
}
但是我什么也没得到,JADE 系统既没有运行宁也没有收到任何错误。
我错过了什么?
P.S.: 我正在研究 ubuntu 20.0.
P.S.: 运行通过“ps -aux”等代码执行其他命令非常有效!
您的问题可能是当前 运行 VM 的 PATH 与您使用的 shell(bash 等)和 CLASSPATH 的隐式传递之间的差异。检查 java 的位置 shell 中哪个 which java
有效并尝试在你的 exec
.
此外,当 运行 时您不会看到所有问题,因为您不会在访问输出流的同时访问错误流,更改为 ProcessBuilder 可以更轻松地调试,因为您可以重定向 out/err 流到文件。但是如果 JADE 运行了很长时间或者产生了很多输出,你应该在后台线程中使用 STDOUT+ERR。
在 jshell 中试试这个:
String[] cmd = new String[]{"java", "jade.Boot", "-gui"};
ProcessBuilder pb = new ProcessBuilder(cmd);
File fileOut = new File("stdout.log");
File fileErr = new File("stderr.log");
pb.redirectError(fileErr);
pb.redirectOutput(fileOut);
Process p = pb.start();
int rc = p.waitFor();
String stdout = Files.readString(fileOut.toPath());
String stderr = Files.readString(fileErr.toPath());
System.out.println("Exit : "+rc +' '+(rc == 0 ? "OK":"**** ERROR ****"));
System.out.println("STDOUT : "+stdout);
System.out.println("STDERR : "+stderr);