我在从 Java 代码中运行另一个 Java 进程时遇到问题。 它应该在后台运行,因此不需要使用流或类似的东西。
我尝试过的是几乎在任何地方都能找到的标准方法:
private static Runtime rt = Runtime.getRuntime();
private static Process pr;
在我的主要方法中,我像这样调用 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 上运行它。 如果这是一个重复的问题,我很抱歉,但我已经解决了大多数类似的问题,但无法找到合适的解决方案。
异常(exception):
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
最佳答案
我尝试在 exec() 之后调用它,它确实有帮助,尽管它看起来很愚蠢:
Thread.sleep(2000);
当然,我会尝试一些较低的值。 我认为问题在于,在我的代码尝试在抛出我提供的异常的方法中使用它之后,我需要初始化该进程。 如果你问我的话,我很疯狂。
我打算不回答这个问题,以防其他人提出更好的解决方案。
编辑:
这种方法似乎也有助于破坏进程。 我只是在主窗口上添加了一个关闭事件,之后立即调用 destroy() 和 sleep()。
关于Java - 使用 exec() 方法运行另一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21080419/