Java: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 + "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/

相关文章:

Java 多线程概念

java - 修改 ArrayList 中的值

java - 如何在不在 libjars 中编写完整类路径的情况下在 scalding/hadoop 作业中运行 slim jar

android - Gradle(Android Studio)不会生成jar文件

java - 覆盖以前的控制台输出

java - 不能从静态上下文引用非静态方法 'getLogger'

java - 将 Map<String, String> 转换为 POJO 列表 - java.lang.IllegalStateException : Expected BEGIN_ARRAY but was STRING

java - 如何静态分析jar包(map-reduce应用程序)并提取一些影响执行时间的功能?

javascript - 将 YouTube 上的 favicon 替换为控制台中的 jquery 字符串

javascript - 如何获取子节点列表?