【问题标题】:Java Runtime.exec woes on LinuxLinux 上的 Java Runtime.exec 问题
【发布时间】: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


    【解决方案1】:

    您的第一次尝试几乎是正确的。

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

    您不需要额外的引用,因为传递单独的 String 参数可以有效地自动引用它。

    【讨论】:

    • 先生,您是最伟大的。我不敢相信答案就这么简单!非常感谢,我从来没有想过做这样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 2021-09-13
    • 2011-01-11
    • 1970-01-01
    • 2012-07-16
    相关资源
    最近更新 更多