【发布时间】:2011-07-25 16:00:59
【问题描述】:
我正在开发一个 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 搞砸了任何命令其中有空格,这就是我调用接受字符串数组的重载的原因)。但是,我仍然遇到问题,我不明白为什么。
【问题讨论】:
标签: java linux bash runtime exec