无法在 Opensuse 上运行 Java Runtime.exec()
Posted
技术标签:
【中文标题】无法在 Opensuse 上运行 Java Runtime.exec()【英文标题】:Cannot run Java Runtime.exec() on Opensuse 【发布时间】:2016-03-26 08:23:15 【问题描述】:我正在使用 Runtime.getRuntime().exec 函数为子程序任务启动独立的 GUI Java 应用程序。
使用的代码很简单:
Runtime.getRuntime().exec("java -jar /home/user/jar.jar");
执行代码不会导致任何进程启动,也不会发生错误! ProcessBuilder 具有相同的效果。 已检查可在 Windows 上正常运行。 看起来,在某些平台上,它在 Java 之外的系统级别上会被忽略,因为 JRE 不会返回任何类型的错误。
EDT:我编辑了代码以通过并行线程读取 stderr 和 stdout 以保留主应用程序执行:
Process p = Runtime.getRuntime().exec(runCmd);
new DaemonFailPrint(p).start();
线程代码是:
public class DaemonFailPrint extends Thread
private Process process;
public DaemonFailPrint(Process process)
this.process = process;
@Override
public void run()
try
process.waitFor();
String out = "";
while (process.getInputStream().available() > 0)
out += (char) process.getInputStream().read();
out += System.lineSeparator();
while (process.getInputStream().available() > 0)
out += (char) process.getErrorStream().read();
JOptionPane.showMessageDialog(null, out);
catch (InterruptedException | IOException ex)
JOptionPane.showMessageDialog(null, ex);
结果是:子进程“启动”后我立即得到空消息框。
意思是Process对象似乎是同时创建和完成的,但不存在错误。
【问题讨论】:
写出好问题需要练习和努力。请浏览tour 并查看help center 部分以及how to ask good questions 部分,希望您未来的问题会更好。 你怎么知道没有启动或没有发生错误?您在哪里向我们展示了如何处理 Process 的 InputStream 或其错误流?如果没有这些,您将不知道进程是否将任何输出传递到其标准输出或标准错误。 顺便说一句。您是在 OpenSuse 上使用“真正的”Oracle Java(由于许可证问题需要手动安装)还是随 OpenSuse - OpenJDK 一起分发的 Java 机器? OpenJDK 是一种替代实现,在某些情况下可能表现不同(我过去已经遇到过 OpenJDK 的一些不兼容问题)。 不。我知道使用 OpenJDK 会造成人员伤亡。我运行手动安装的官方 Oracle 发行版和最新更新。 【参考方案1】:到目前为止一切顺利!我最近自己找到了答案,仍然没有理由为什么它会这样工作,但我想这都是关于在不同平台上处理 VM 中的新进程的内部差异。 我不得不以这种方式编辑代码,现在它可以工作了:
String[] runcmd = "java","-jar","/home/user/jar.jar";
Runtime.getRuntime().exec(runcmd);
现在它看起来很完美。正如我所见,它无法处理文件并执行 then 命令,参数为相同字符串,而 Java 代码级别没有抛出错误,它可能在 VM 内部丢失。
【讨论】:
【参考方案2】:Runtime::exec() 不会等待进程退出,所以如果你想检测执行程序本身的错误,你需要使用类似的东西:
Process process = Runtime.getRuntime().exec("java -jar /home/user/jar.jar");
int rc = process.waitFor();
if (rc != 0)
System.err.println("The process failed with error: " + rc);
可能是找不到jar或者无法执行等,你通常在控制台上看到的那些错误,但如果你没有控制台,唯一的线索可能是返回码。
您可能还想在这里查看如何捕获输出控制台: Capturing stdout when calling Runtime.exec
看来你可以使用process.getInputStream()
来连接进程的输出流。因此,您可以简单地将其复制到控制台以查看发生了什么。
【讨论】:
我不会尝试等待进程退出,我会启动长时间运行的功能独立进程,正如我所见,它根本没有启动,相同的代码正在 Windows 平台上运行跨度> 那么您只能看到启动进程本身的错误(在您的情况下为 java.exe),但看不到实际启动的应用程序(因此您将无法在例如 java.util. exe 找不到 jar 并因错误而终止 - 在这种情况下将启动 java.exe 本身,因此将创建该进程,但它将立即因错误而终止)。尝试从命令行启动相同的命令,在这种情况下是否有效? 确实如此。再一次,这个问题看起来像是在这个平台上阻止 VM 启动子进程而没有错误。 现在也尝试从子进程的stderr读取,java没有错误,实际上子进程的stderr和stdout都没有读取任何内容。 您是否也尝试过使用 process.waitFor()?就好像它“没有开始”一样,这个过程很快就会终止——只是为了获得线索(然后在之后将其注释掉),看看是否真的存在这样的问题。如果您在 waitFor() 之前立即进行测试,则输出可能还没有准备好。以上是关于无法在 Opensuse 上运行 Java Runtime.exec()的主要内容,如果未能解决你的问题,请参考以下文章
OpenSuse - 无法安装 Rails:在介质上找不到文件
Android Studio 无法在 OpenSUSE 上启动(打开的文件太多)