【问题标题】:how can I execute "java" command by java code?如何通过 java 代码执行“java”命令?
【发布时间】:2020-06-24 11:08:11
【问题描述】:

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

【问题讨论】:

  • 尝试读取并打印错误流,看看是否有错误。类路径是否设置为存放翡翠文件夹的文件夹?
  • @NormR 是的,这似乎是与类路径有关的问题,谢谢!现在我正在努力解决它。

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


【解决方案1】:

您的问题可能是当前运行的 VM 的 PATH 与您使用的 shell(bash 等)和 CLASSPATH 的隐式传递之间的差异。检查 which java 在 shell 中的 java 位置,并尝试在你的 exec 中使用。

此外,您不会在运行时看到所有问题,因为您不会与输出流同时访问错误流,更改为 ProcessBuilder 可以更轻松地调试,因为您可以将输出/错误流重定向到文件。但是如果 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);

【讨论】:

  • 感谢您的回答,它在 jshell 上运行良好,但它给出了带有代码的“ClassNotFoundException”,我该如何解决类路径问题?至于“which java”,它给出了相同的输出“/usr/bin/java”@DuncG
  • 您的命令行 shell 调用可能会使用环境变量 CLASSPATH 拾取翡翠。试试echo $CLASSPATH,也许你可以将“-cp”和那个值添加到你从ProcessBuilder(cmd)的启动中,或者将值作为-Dmyjade.classpath=whatever传递到你的java应用程序启动中,并在“-cp”之后引用System.getProperty("myjade.classpath") .或者,如果你的 shell 已经完成了所有设置,你可以启动 shell 并传入jade命令,例如 `cmd = {"bash", "-c", "java jam.Boot -gui"}
猜你喜欢
  • 1970-01-01
  • 2020-02-26
  • 2011-05-08
  • 1970-01-01
  • 2018-05-10
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多