【问题标题】:Java: Runtime.exec() only work thru consoleJava:Runtime.exec() 只能通过控制台工作
【发布时间】:2012-10-01 22:13:00
【问题描述】:

我有一个问题, 我制作了一个 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 尝试过,结果相同。 (在控制台中工作,但不能独立使用)

【问题讨论】:

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

标签: java jar console runtime.exec


【解决方案1】:

一些提示:

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

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

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

调用您环境的 shell(例如 cmd /e 或 /bin/bash 或 what-have-you,并让 shell 执行批处理文件。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 2020-06-08
      • 1970-01-01
      • 2022-12-03
      • 2021-09-05
      • 1970-01-01
      相关资源
      最近更新 更多