2014-01-12 47 views
0

我無法在Java代碼中運行另一個Java進程。 它應該在後臺運行,所以不需要使用流或類似的東西。Java - 使用exec()方法運行另一個進程

我已經試過是標準的方法找到幾乎任何地方:

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(); 

我試圖在Linux上使用Eclipse來運行此操作。 如果這是一個重複的問題,我很抱歉,但我經歷了大多數類似的問題,但無法找到合適的解決方案。

例外:

輸出的

System.out.println(pr.getErrorStream().toString()); 
System.out.println(pr.getInputStream().toString()); 

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] 

是:

[email protected] [email protected]

+0

如果你可以發佈異常,那就太好了。 –

+0

@SotiriosDelimanolis我已更新我的帖子。 – Venom

+0

看起來異常與您發佈的代碼有關。 –

回答

0

我試過在exec()和後調用它它絕對有幫助,雖然它看起來很愚蠢:

Thread.sleep(2000); 

當然,我會嘗試一些較低的值。 我認爲,問題在於我的代碼試圖在從我提供的例外處拋出的方法中使用它的過程中,我需要初始化該過程。 瘋狂,如果你問我。

我打算在這種情況下讓別人提出一個更好的解決方案。

編輯:

這種方法也似乎幫助銷燬的過程中,也。 我只是在我的主窗口中添加了一個關閉事件,之後我立即調用destroy()和sleep()。

相關問題