Java运行时命令行进程

Java运行时命令行进程,java,eclipse,runtime,environment,runtime.exec,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-ver

我有一个具有以下代码的类:

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.io.IOException:无法运行程序“gs”:错误=2,没有这样的文件或目录
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
位于java.lang.Runtime.exec(Runtime.java:593)
位于java.lang.Runtime.exec(Runtime.java:431)
位于java.lang.Runtime.exec(Runtime.java:328)
位于clris.batchdownloader.TestJDBC.main(TestJDBC.java:17)
原因:java.io.IOException:error=2,没有这样的文件或目录
位于java.lang.UNIXProcess.forkAndExec(本机方法)
位于java.lang.UNIXProcess(UNIXProcess.java:53)
在java.lang.ProcessImpl.start(ProcessImpl.java:91)
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
... 4更多
在我的程序中,我可以将“gs”替换为:“java”、“mvn”、“svn”,并且可以正常工作。但“gs”不是。只有在eclipse中我才有这个问题


有什么想法,关于我需要做什么来解决这个问题吗?

我认为您需要在Eclipse运行配置中将路径设置为环境变量。

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

(请参阅获取此代码段的文章,您需要其中的其他类才能使其正常工作。)

试一试-

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();
List命令=new ArrayList();
commands.add(“/bin/sh”);
命令。添加(“-c”);
命令。添加(“gs-版本”);
尝试
{
ProcessBuilder pb=新的ProcessBuilder(命令);
Process进程=pb.start();
inputStreamHandler=新的ThreadedStreamHandler(
process.getInputStream());
errorStreamHandler=新的ThreadedStreamHandler(
process.getErrorStream());
inputStreamHandler.start();
errorStreamHandler.start();
process.waitFor();
inputStreamHandler.interrupt();
errorStreamHandler.interrupt();
inputStreamHandler.join();
errorStreamHandler.join();
}
捕获(IOE异常)
{
Log.err(e);
}
捕捉(中断异常e)
{
Log.err(e);
}
StringBuilder stdout=inputStreamHandler.getOutputBuffer();

在程序的Eclipse运行配置中,转到环境选项卡并添加一个名为“PATH”的新环境变量,其中的值类似于(在Windows中)“C:\program Files(x86)\gs\gs9.02\bin;%PATH%”

这应该行得通

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


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

我遇到了相同的问题,并且发现了问题。Eclipse中的PATH变量的内容与命令行中的变量不同

解决方案:

在命令行中查找$Path变量并复制内容。 然后打开运行配置->环境并选择新建。 名称:$PATH 值:插入复制的内容


这就解决了问题。

因此我尝试在“运行配置”->环境选项卡和“链接资源”(首选项->常规->工作区->链接资源)中添加“gs”的路径。两者都不起作用……你知道为什么eclipse不能获得系统路径,在什么情况下必须定义eclipse环境路径吗?这就是为什么人们编写的软件不能移植到另一个系统。