1

我遇到了一个问题,我制作了一个 Java 应用程序,它下载了另一个 Java 应用程序 (Jar) 并将其保存在 appdata 中,然后它应该运行它并且这也可以。但是我用来运行第二个 Jar 的 Runtime.exec() 仅在我通过控制台运行主 Jar 时才有效。

String command = "java -jar -Xms" + comboBox.getSelectedItem() + " " 
    + Util.getWorkingDirectory() + File.separator + "zlauncher" 
    + File.separator + "minecraftStarter.jar " + txtUsername.getText() + " " 
    + passwordField.getText() + " " + Util.toString(chckbxRemember.isSelected());
Runtime rt = Runtime.getRuntime();
rt.exec(command);

当通过控制台启动这个时,它可以工作,但当我将它作为独立 Jar 运行时就不行了。

你能给我一个提示,我如何在不需要控制台的情况下可视化启动第二个 Jar 的方式?

编辑:我也用 ProcessBuilder 尝试过,结果相同。(在控制台中工作,但不是独立的)

4

2 回答 2

3

一些提示:

仅仅因为您无法使用 ProcessBuilder 让它以不同的方式工作并不意味着您应该放弃并使用 Runtime.exec()。Runtime.exec() 介于非常困难和不可能用于任何不平凡的事情之间。所以使用 ProcessBuilder - 你会很高兴你这样做了。

使用采用列表的 ProcessBuilder 构造函数,而不是采用字符串的构造函数。接受字符串的问题与 Runtime.exec() 完全相同

如果可能,请使用 Windows 的批处理文件或 Linux 的 shell 脚本,它们会为您完成尽可能多的工作(设置路径等)。一旦你在命令行中调试了它,你就可以更容易地将它与 ProcessBuilder 一起使用。

调用您环境的外壳程序(例如 cmd /e 或 /bin/bash,或你有什么,并让外壳程序执行批处理文件。

不要忘记从生成的进程中读取输出流。如果你不这样做,子进程很可能会被锁定。

于 2012-10-01T23:50:15.510 回答
0

您应该将命令放入字符串数组中:

Runtime rt = Runtime.getRuntime();
rt.exec(new String[] { "java", "-jar", "-Xms", comboBox.getSelectedItem(), Util.getWorkingDirectory() + File.separator + "zlauncher" + File.separator + ""minecraftStarter.jar", txtUsername.getText(), passwordField.getText(), Util.toString(chckbxRemember.isSelected()) });
于 2012-10-02T00:54:21.223 回答