Выполнение команды Linux в Терминале из Java

В настоящее время я использую команду под названием «curl» из терминала в Ubuntu, чтобы загрузить мои файлы .RDF в магазин Virtuoso RDF.

curl -T FILE URL -u USER:PASSWORD

Я хочу автоматизировать этот процесс, чтобы создать функцию Java в eclipse. Этот код не работает.

String[] command = {"curl -T", FILENAME, URL, "-u", credentials.USERNAME+":"+credentials.PASSWORD};
Runtime.getRuntime().exec(command)

Я тоже пробовал с этим. Появляется xterm, но он показывает эту ошибку (хотя файл находится в пути функции):

*"/usr/bin/xterm. Can't execvp "curl" no such a directory or file"*


Runtime.getRuntime().exec("/usr/bin/xterm -e \"curl -T " + FILENAME  
                                                        + " " + URL + "-u " + credentials.USERNAME
                                                        + ":" + credentials.PASSWORD + "\"");

Буду признателен за любую помощь в этом вопросе.

заранее спасибо


person User 23    schedule 02.06.2015    source источник
comment
вы ведете его как себя? переменные env могут отличаться, если нет, и curl не будет виден, если не в переменной PATH.... вы можете отладить что-то вроде printenv PATH и проверить   -  person Palcente    schedule 02.06.2015
comment
Если вы хотите просто выполнить программу для некоторых файлов в Eclipse, используйте внешние инструменты, расположенные рядом со значками панели инструментов Debug и Java. Эти конфигурации запуска должны быть более удобными.   -  person Michał Grzejszczak    schedule 02.06.2015


Ответы (2)


Раньше мне было трудно запускать команды с помощью Runtime.exec(). В любом случае я перешел на использование ProcessBuilder следующим образом:

ProcessBuilder pbuilder = new ProcessBuilder("bash", "-c", <<your command as string>>);
        File err = new File("err.txt");
        try {
            pbuilder.redirectError(err);
            Process p = pbuilder.start();
            p.waitFor();      

        } catch (Exception e) 
        {
             //handle exceptions if any.
        }

Строка stderr является необязательной для целей отладки. Я уверен, что его можно напрямую распечатать на консоли, но еще не проверял. Обновлю свой ответ, как только найду больше.

Вы можете ознакомиться со страницей документации здесь.

PS: Также проверьте, есть ли у вас необходимые разрешения для выполнения нужной задачи.

person Samuel Bushi    schedule 02.06.2015
comment
Я очень ценю это @blumonkey. Я ничего не знал о ProcessBuilder, но он действительно решает мою проблему: в любом случае, у меня проблемы с обнаружением ошибок. Эта строка у меня не работает: `pbuilder.redirectError(err); ` Вместо этого я должен использовать код pbuilder.redirectErrorStream(), и я не могу поймать ошибки. - person User 23; 03.06.2015
comment
Странный. Возможно, ошибки выводятся в STDOUT, а не в STDERR. Попробуйте также перенаправить вывод. См. здесь, чтобы перенаправить на консоль. Вы можете немного изменить принятый ответ для errorStream. - person Samuel Bushi; 03.06.2015

Использование Runtime.exec, как правило, является плохой идеей, почему бы не использовать API-интерфейсы Java HTTP для загрузки файлов?

person Sunny Das    schedule 02.06.2015