Использование Runtime.exec() в Java

Что вы должны сделать в Java, чтобы получить Runtime.exec() для запуска программы, которая находится на пути? Я пытаюсь запустить gpsbabel, который я указал в пути (/usr/local/bin).

public class GpxLib {

    public static void main(String[] args) {
        try
        {
            Runtime r = Runtime.getRuntime();
            Process p = r.exec("gpsbabel -i garmin -f usb: -o gpx -F -");
            InputStream is = p.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            while (true)
            {
                String s = br.readLine();
                if (s == null)
                    break;
                System.out.println(s);
            }
            br.readLine();
        } catch (IOException e) {
            e.printStackTrace(System.err);
        }
    }
}

4 ответа

Решение

Он унаследует путь от процесса Java. Таким образом, независимо от среды, в которой находится процесс Java, порожденный процесс также будет иметь место. Вот как проверить окружающую среду:

Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
     System.out.format("%s=%s%n", envName, env.get(envName));
}

Вы установили PATH и экспортировал это? Если вы не экспортируете его, он недоступен для подпроцессов.

Кроме того, вы должны использовать stdout и stderr одновременно, чтобы предотвратить блокировку. В противном случае вещи будут работать в некоторых обстоятельствах, тогда ваш порожденный процесс выведет другое количество данных, и все остановится.

Смотрите этот ответ для более подробной информации.

Я добавил звонок System.out.println(System.getenv("PATH")); который только распечатывает

/usr/bin:/bin:/usr/sbin:/sbin

поэтому по какой-то причине /usr/local/bin не отображается. Похоже, что это вопрос MacOSX или Eclipse, а не вопрос Java. редактировать: вместо этого задал этот вопрос на суперпользователя.

Что бы вы ни делали, вы должны прочитать это. Никто не должен использовать Runtime.exec() не прочитав это.

Вот решение:

ProcessBuilder proc = new ProcessBuilder("<Directory PAth>" + "Executable.exe");
proc.redirectOutput(ProcessBuilder.Redirect.INHERIT);
proc.directory(fi); //fi = the output directory path
proc.start();

путь к исполняемому файлу программы \ приложения, например "C:\MyProg\"

Другие вопросы по тегам