不能在 Opensuse 上 运行 Java Runtime.exec()
Cannot run Java Runtime.exec() on Opensuse
我正在使用 Runtime.getRuntime().exec 函数启动独立的 GUI Java 子程序任务应用程序。
使用的代码比较简单:
Runtime.getRuntime().exec("java -jar /home/user/jar.jar");
执行代码不会导致任何进程启动,也不会发生错误! ProcessBuilder 具有相同的效果。
已检查以在 Windows 上正常工作。
看起来,在某些平台上,它在 Java 之外的系统级别被忽略,因为 JRE 不会 return 任何类型的错误。
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);
}
}
}
结果是:在子进程 "launched".
之后我直接得到空的消息框
意思是 Process 对象似乎同时创建和完成,但不存在错误。
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 或无法执行等,您通常会在控制台上看到这些错误,但如果您没有控制台,唯一的线索可能是 return 代码.
您可能还想在此处查看如何捕获输出控制台:
Capturing stdout when calling Runtime.exec
似乎可以使用 process.getInputStream()
连接到进程的输出流。所以你可以简单地把它复制到控制台看看发生了什么。
到目前为止一切顺利!我最近自己找到了答案,仍然不知道为什么它会这样工作,但我想这完全是关于在不同平台上处理 VM 中的新进程的内部差异。
我不得不以这种方式编辑代码,现在它可以工作了:
String[] runcmd = {"java","-jar","/home/user/jar.jar"};
Runtime.getRuntime().exec(runcmd);
现在看来效果很好。正如我所看到的那样,它无法处理文件并使用作为相同字符串给定的参数执行命令,而在 Java 代码级别没有抛出错误,它可能在 VM 内部丢失。
我正在使用 Runtime.getRuntime().exec 函数启动独立的 GUI Java 子程序任务应用程序。
使用的代码比较简单:
Runtime.getRuntime().exec("java -jar /home/user/jar.jar");
执行代码不会导致任何进程启动,也不会发生错误! ProcessBuilder 具有相同的效果。 已检查以在 Windows 上正常工作。 看起来,在某些平台上,它在 Java 之外的系统级别被忽略,因为 JRE 不会 return 任何类型的错误。
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);
}
}
}
结果是:在子进程 "launched".
之后我直接得到空的消息框意思是 Process 对象似乎同时创建和完成,但不存在错误。
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 或无法执行等,您通常会在控制台上看到这些错误,但如果您没有控制台,唯一的线索可能是 return 代码.
您可能还想在此处查看如何捕获输出控制台: Capturing stdout when calling Runtime.exec
似乎可以使用 process.getInputStream()
连接到进程的输出流。所以你可以简单地把它复制到控制台看看发生了什么。
到目前为止一切顺利!我最近自己找到了答案,仍然不知道为什么它会这样工作,但我想这完全是关于在不同平台上处理 VM 中的新进程的内部差异。 我不得不以这种方式编辑代码,现在它可以工作了:
String[] runcmd = {"java","-jar","/home/user/jar.jar"};
Runtime.getRuntime().exec(runcmd);
现在看来效果很好。正如我所看到的那样,它无法处理文件并使用作为相同字符串给定的参数执行命令,而在 Java 代码级别没有抛出错误,它可能在 VM 内部丢失。