我有一个问题, 我制作了一个 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,结果相同。 (在控制台中工作,但不是独立的)
最佳答案
一些提示:
仅仅因为您无法使用 ProcessBuilder 使其以不同的方式工作并不意味着您应该放弃并使用 Runtime.exec()。 Runtime.exec() 介于非常困难和不可能用于任何非琐碎的事情之间。所以使用 ProcessBuilder - 你会很高兴你这样做了。
使用带有列表的 ProcessBuilder 构造函数,而不是带有字符串的构造函数。接受字符串的那个与 Runtime.exec() 有完全相同的问题
如果可能,请使用适用于 Windows 的批处理文件或适用于 Linux 的 shell 脚本,它们会为您完成尽可能多的工作(设置路径等)。一旦您在命令行对其进行了调试,您将可以更轻松地将其与 ProcessBuilder 一起使用。
调用您环境的 shell(例如 cmd/e 或/bin/bash,或者您有什么,并让 shell 执行批处理文件。
不要忘记从生成的进程中读取输出流。如果不这样做,子进程很可能会锁定。
关于Java:Runtime.exec() 只能通过控制台工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12681865/