我正在尝试使用JADE通过代码运行多代理系统。 通常,我可以使用以下命令通过命令行运行玉器系统:
java jade.Boot -gui
通过更改项目属性并将运行配置指向jade.Boot类,它也可以在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”之类的代码运行其他命令效果很好!
答案 0 :(得分:1)
您的问题可能是当前运行的VM的PATH,与您使用的shell(bash等)相比和CLASSPATH的隐式传递之间的差异。在工作的外壳中检查which java
所在的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);