[英]Java Runtime.exec woes on Linux
我正在開發一個 Java 程序,該程序設計用於 Linux 環境,該程序創建了一個運行另一個 Java 類的新 Java 進程,但我遇到了問題。 我終於解決了我所有的問題。 調用
Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'" })
在我的 Java 程序中返回
/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)
/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'
給出正確的輸出,沒有錯誤。
我知道 Runtime.exec 的使用非常復雜到完美,我已經解決了我之前從中得到的一些大問題,但是這個問題只是讓我感到困惑(例如 Runtime.exec 使用 StringTokenizer 搞砸了任何有空格的命令在它們中,這就是我調用接受字符串數組的重載的原因)。 但是,我仍然遇到問題,我不明白為什么。
你的第一次嘗試幾乎是正確的。
Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "java -classpath /home/kevin/workspace/Misc/bin HelloWorld" })
您不需要額外的引用,因為傳遞單個String
參數會自動有效地引用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.