如何通过Java代码执行“ java”命令?

时间:2020-06-24 11:08:11

标签: java ubuntu command-line agents-jade multi-agent

我正在尝试使用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”之类的代码运行其他命令效果很好!

1 个答案:

答案 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);