Java:Runtime.exec()只能通过控制台工作

Java:Runtime.exec()只能通过控制台工作,java,jar,console,runtime.exec,Java,Jar,Console,Runtime.exec,我有个问题, 我制作了一个Java应用程序,它下载另一个Java应用程序(Jar)并将其保存在appdata中,然后它应该运行它,这也可以工作。 但是我用来运行第二个Jar的Runtime.exec()只有在通过控制台运行主Jar时才起作用 String command = "java -jar -Xms" + comboBox.getSelectedItem() + " " + Util.getWorkingDirectory() + File.separator + "zlaunc

我有个问题, 我制作了一个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运行时就不行了

你能给我一个提示,我如何想象一种不用控制台就能启动第二个罐子的方法

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

一些提示:

仅仅因为您无法使用ProcessBuilder使其以不同的方式工作,并不意味着您应该放弃并使用Runtime.exec()。Runtime.exec()对于任何非平凡的东西都是非常困难和不可能使用的。因此,请使用ProcessBuilder—您会很高兴您这样做了

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

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

调用您的环境的shell(例如cmd/e或/bin/bash,或者您所拥有的任何东西),并让shell执行批处理文件


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

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

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()) });

您所说的“作为独立jar启动”是什么意思?在Windows中,您可以直接用Java启动jar,而不需要控制台。(它基于gui)您是否尝试过使用javaw启动器而不是Java?(例如,String command=“javaw-jar-Xms”[…])这次(使用javaw)它向我显示了一个错误:“无法创建Java虚拟机”作为Messagebox。(没有特殊错误代码,只有此消息)