【发布时间】:2014-01-12 21:20:03
【问题描述】:
我无法从我的 Java 代码中运行另一个 Java 进程。 它应该在后台运行,因此不需要使用流或类似的东西。
我尝试的是几乎在任何地方都能找到的标准方法:
private static Runtime rt = Runtime.getRuntime();
private static Process pr;
在我的 main 方法中,我这样调用 exec() 方法:
pr = rt.exec("java -cp /home/luka/workspace/SocketServer SocketServer");
由于某种原因,这会引发大量异常。当然,有问题的应用程序已经编译成 .class 文件。
这个我也试过了,发现here:
pr = rt.exec(new String[] { "/bin/bash", "-c", "java -classpath /home/luka/workspace/SocketServer SocketServer" });
当我尝试使用终端执行相同的命令时,它工作得很好。 我认为这可能是一个安全问题,但我不太确定,因为我可以执行上述命令而无需“sudo”。
另外,这行代码是需要还是在主进程关闭时隐式销毁子进程?
pr.destroy();
我正在尝试使用 Eclipse 在 Linux 上运行它。 如果这是一个重复的问题,我很抱歉,但我已经解决了大多数类似的问题,但无法找到合适的解决方案。
例外:
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.7.0_25]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) ~[na:1.7.0_25]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) ~[na:1.7.0_25]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) ~[na:1.7.0_25]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.7.0_25]
at java.net.Socket.connect(Socket.java:579) ~[na:1.7.0_25]
at java.net.Socket.connect(Socket.java:528) ~[na:1.7.0_25]
at java.net.Socket.<init>(Socket.java:425) ~[na:1.7.0_25]
at java.net.Socket.<init>(Socket.java:208) ~[na:1.7.0_25]
at src.MainWindow.connect(MainWindow.java:213) ~[JAVA_vj10/:na]
at src.MainWindow.access$2(MainWindow.java:209) ~[JAVA_vj10/:na]
at src.MainWindow$1.run(MainWindow.java:67) ~[JAVA_vj10/:na]
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) ~[na:1.7.0_25]
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733) ~[na:1.7.0_25]
at java.awt.EventQueue.access$200(EventQueue.java:103) ~[na:1.7.0_25]
at java.awt.EventQueue$3.run(EventQueue.java:694) ~[na:1.7.0_25]
at java.awt.EventQueue$3.run(EventQueue.java:692) ~[na:1.7.0_25]
at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_25]
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) ~[na:1.7.0_25]
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703) ~[na:1.7.0_25]
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) ~[na:1.7.0_25]
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) ~[na:1.7.0_25]
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) ~[na:1.7.0_25]
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) ~[na:1.7.0_25]
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) ~[na:1.7.0_25]
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) ~[na:1.7.0_25]
输出
System.out.println(pr.getErrorStream().toString());
System.out.println(pr.getInputStream().toString());
是:
java.lang.UNIXProcess$ProcessPipeInputStream@4443ad java.lang.UNIXProcess$ProcessPipeInputStream@1b74334
【问题讨论】:
-
如果你能发布异常,那就太好了。
-
@SotiriosDelimanolis 我已经更新了我的帖子。
-
看起来该异常与您发布的代码无关。
-
@SotiriosDelimanolis 我不知道它可能是什么,因为当我尝试从终端运行它时没有抛出异常。
-
堆栈跟踪告诉您异常发生的确切位置。
src.MainWindow.connect213 行。