2011-03-29 116 views
5

嘿,夥計們。我正在開發一個Java程序,專門用於Linux環境,該環境創建一個運行另一個Java類的新Java進程,但是我遇到了問題。我終於解決了所有問題。在我的Java程序調用在Linux上運行Java Runtime.exec

Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'" }) 

在任一標準輸出/標準錯誤返回

/bin/bash: /usr/lib/jvm/java-6-openjdk/jre/bin/java -classpath /home/kevin/workspace/Misc/bin HelloWorld: No such file or directory 

。如果我嘗試

Runtime.getRuntime().exec(new String[] { "/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'" }) 

我得到一個Java異常

Cannot run program "/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'": java.io.IOException: error=2, No such file or directory 
    ... 
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory 

最後,用一個簡單的

Runtime.getRuntime().exec("/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'") 

給了我一個

-classpath: -c: line 0: unexpected EOF while looking for matching `'' 
-classpath: -c: line 1: syntax error: unexpected end of file 

從標準輸出/標準錯誤。

同時,創建一個新的行sh文件(和分配適當的權限),只有這(無#!/斌/慶典在文件的頂部)

/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld' 

給出了正確的輸出沒有錯誤。

據我所知,使用的Runtime.exec是相當複雜的完善,我已經解決了我之前從中得到了一些大的問題,但這個問題只是簡單的讓我爲難,(如的Runtime.exec的使用的StringTokenizer的搞砸了任何在它們中有空格的命令,這就是爲什麼我調用接受String數組的重載)。但是,我仍然遇到問題,我不明白爲什麼。

回答

11

你的第一次嘗試幾乎是正確的。

Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "java -classpath /home/kevin/workspace/Misc/bin HelloWorld" }) 

你不需要額外的報價,因爲通過個人String參數自動有效報價吧。

+2

先生,你是最偉大的。我簡直不敢相信答案是那麼簡單!非常感謝你,我永遠不會想到做那樣的事情。 – 2011-03-29 22:14:58