2011-03-29 69 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