Java Runtime命令行进程

时间:2010-04-09 19:50:50

标签: java eclipse runtime environment runtime.exec

我有一个包含以下代码的课程:

Process process = null;
try {
    process = Runtime.getRuntime().exec("gs -version");
    System.out.println(process.toString());
} catch (Exception e1) {
    e1.printStackTrace();
} finally {
    process.destroy();
}

我可以在命令行运行“gs -version”并获取: GPL Ghostscript 8.71(2010-02-10) 版权所有(C)2010 Artifex Software,Inc。保留所有权利。

所以我知道我的路径至少要设置在某处。

我可以从命令行运行该类,但它可以工作。但是当我使用eclipse运行它时,我得到以下错误:

java.io.IOException: Cannot run program "gs": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
    at java.lang.Runtime.exec(Runtime.java:593)
    at java.lang.Runtime.exec(Runtime.java:431)
    at java.lang.Runtime.exec(Runtime.java:328)
    at clris.batchdownloader.TestJDBC.main(TestJDBC.java:17)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:53)
    at java.lang.ProcessImpl.start(ProcessImpl.java:91)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
    ... 4 more

在我的程序中,我可以用“java”,“mvn”,“svn”代替“gs”,它可以工作。但“gs”却没有。这只是在日食中我遇到了这个问题。

关于我需要做些什么来解决这个问题?

5 个答案:

答案 0 :(得分:3)

我认为您需要在Eclipse Run配置中将PATH设置为环境变量。

答案 1 :(得分:3)

(请参阅http://www.devdaily.com/java/java-exec-processbuilder-process-2以获取此代码段的文章,您需要其他类才能使其正常运行。)

给这一点 -

List<String> commands = new ArrayList<String>();
    commands.add("/bin/sh");
    commands.add("-c");
    commands.add("gs -version");
    try
    {
        ProcessBuilder pb = new ProcessBuilder(commands);
        Process process = pb.start();

        inputStreamHandler = new ThreadedStreamHandler(
                process.getInputStream() );
        errorStreamHandler = new ThreadedStreamHandler(
                process.getErrorStream());

        inputStreamHandler.start();
        errorStreamHandler.start();

        process.waitFor();

        inputStreamHandler.interrupt();
        errorStreamHandler.interrupt();

        inputStreamHandler.join();
        errorStreamHandler.join();
    }
    catch (IOException e)
    {
        Log.err(e);
    }
    catch (InterruptedException e)
    {
        Log.err(e);
    }
    StringBuilder stdout = inputStreamHandler.getOutputBuffer();

答案 2 :(得分:2)

在程序的Eclipse Run Configurations中,转到Environment选项卡并添加一个名为“PATH”的新环境变量,其值如下所示(在Windows中)“C:\ Program Files(x86)\ gs \ gs9.02 \ BIN;%PATH%”

这应该有用。

要么是在java程序中,要么在java程序中,而不是运行Runtime.exec(“gs ...”),执行一个Runtime.exec(“my-batch-file.bat”...),其中my- batch-file.bat将包含一行设置ghostscript可执行文件的路径:

设置PATH = C:\ Program Files(x86)\ gs \ gs9.02 \ bin;%PATH%

答案 3 :(得分:1)

我有同样的问题,我发现了问题。 Eclipse中的Path变量与命令行中的路径变量的内容不同。

<强>解决方案:

在命令行中查找$ Path变量并复制内容。 然后打开Run Configuration-&gt; Environment并选择new。 名称:$ PATH 值:插入复制的内容。

这解决了问题。

答案 4 :(得分:-1)

你可以完全限定gs的位置 - 这可能是最好的方法,因为你不应该信任系统的路径......