2012-10-01 67 views
1

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

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

当启动这个通过控制台,它的工作,但不是当我运行它作为独立的罐子。

你能给我一个提示,我如何可视化一种启动第二个罐子的方式而不需要控制台?

编辑:我也试过它与ProcessBuilder,同样的结果。 (工程在控制台上,而不是作为独立的)

+0

你这是什么意思,“开始作为一个独立的罐子?' – bmargulies

+0

在Windows中,您可以使用Java直接启动Jar,因此您不需要控制台。 (这是基于gui的) – IZED

+0

你尝试过使用javaw启动器而不是java吗? (例如String command =“javaw -jar -Xms”[...]) – besen

回答

3

一些提示:

只是因为你不能把它用不同的ProcessBuilder并不意味着你应该放弃,然后使用运行工作。 EXEC()。 Runtime.exec()介于真正困难和不可能用于任何非trival的事情之间。所以使用ProcessBuilder - 你会很高兴你做到了。

使用带有列表的ProcessBuilder构造函数,而不是使用String的构造函数。采用字符串的问题与Runtime.exec()完全相同问题如果可能,请使用Windows的批处理文件或Linux的shell脚本,尽可能为您完成尽可能多的工作(设置路径等)。一旦你在命令行调试了它,你就可以更容易地将它用于ProcessBuilder。

调用你的环境的外壳(例如,cmd/E或/斌/庆典,或者是什么具备的,你,和有壳执行批处理文件。

不要忘记阅读从输出流衍生的过程。如果你不这样做,子进程将很可能锁定

0

您shuld把命令转换为字符串数组:。

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