Java Runtime командной строки Процесс - PullRequest
3 голосов
/ 09 апреля 2010

У меня есть класс со следующим кодом:

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) Copyright (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

В моей программе я могу заменить "gs" на: "java", "mvn", "svn", и это работает. Но "гс" нет. Это только в затмении у меня есть эта проблема.

Есть идеи, что мне нужно сделать, чтобы решить эту проблему?

Ответы [ 5 ]

3 голосов
/ 09 апреля 2010

(см. 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();
3 голосов
/ 09 апреля 2010

Я думаю, вам нужно установить переменную PATH в качестве переменной среды в вашей конфигурации Eclipse Run.

2 голосов
/ 12 сентября 2011

В настройках Eclipse Run для вашей программы перейдите на вкладку Environment и добавьте новую переменную Environment под названием «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%

1 голос
/ 11 января 2012

У меня была такая же проблема, и я нашел проблему. Переменная Path в Eclipse имела содержимое, отличное от того, которое было в командной строке.

Решение:

Найдите переменную $ Path в командной строке и скопируйте содержимое. Затем откройте Run Configuration-> Environment и выберите новый. Имя: $ PATH Значение: вставить скопированный контент.

Это решило проблему.

0 голосов
/ 09 апреля 2010

Вы можете полностью определить местоположение gs - это, вероятно, лучший способ, поскольку не стоит доверять пути системы ...

...