getRuntime().exec не работает должным образом

Я пытаюсь заставить свою java-программу запускать команду svn из командной строки, которая будет записывать журналы в файл xml.

Вот что я хочу сделать:

Runtime.getRuntime().exec("cmd.exe /c svn log /location/ --xml > c:\\output.xml");

однако он ничего не напечатает в файл xml.

когда я ввожу «svn log /location/ --xml > output.xml» непосредственно в cmd, он будет печатать журналы, как и ожидалось, в файл xml.

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

Runtime.getRuntime().exec("cmd.exe /c echo \"test\" > c:\\work\\output.xml");

ОК, после прочтения Когда Runtime.exec() Wont, я определил, что по какой-то причине svn не распознается, когда я запускаю команду с java, но это прекрасно, когда я ввожу его вручную в командную строку

Любые идеи? Дайте мне знать, если у вас есть какие-либо вопросы, с которыми я мог бы вам помочь.


person Aelfhere    schedule 03.06.2011    source источник
comment
Вы фиксируете какие-либо выходные данные или ошибки и печатаете их в своих журналах? то есть svn терпит неудачу?   -  person Peter Lawrey    schedule 03.06.2011
comment
Прочтите Когда Runtime.exec() не работает. Все 4 страницы. Затем отредактируйте свой вопрос, включив в него сведения о реальной проблеме.   -  person BalusC    schedule 03.06.2011
comment
хорошо, @BalusC, я прочитал 4 страницы ... и понял, в чем моя проблема, описанная выше, однако я все еще не могу заставить ее работать. На самом деле, я даже не могу заставить работать правильное решение на странице 4. Возможно, я полный идиот, но мне нужно, чтобы мне это объяснили, как будто мне 2 года, с очень конкретными инструкциями, что делать. Я не знаю, как описать НАСТОЯЩУЮ проблему, потому что, честно говоря, я не знаю, в чем настоящая проблема.   -  person Aelfhere    schedule 03.06.2011
comment
Статья должна была дать вам представление о том, как фиксировать фактический вывод командной консоли (и ошибки, если они есть), например, как если бы вы сами вводили команду в консоли. Этот вывод должен содержать ответ на вашу проблему. Например, svn: Unknown command или что-то в этом роде. Эта информация должна помочь вам лучше решить проблему.   -  person BalusC    schedule 04.06.2011
comment
хорошо, теперь вопрос обновлен важной информацией   -  person Aelfhere    schedule 04.06.2011


Ответы (3)


Можете ли вы попробовать указать полный путь к вашему двоичному файлу svn в первом вызове метода exec.

person anubhava    schedule 03.06.2011
comment
ну, я не могу дать вам полный путь, так как это база данных компании... но я могу сказать вам, что это https://IP_address/svn/etc/ - person Aelfhere; 03.06.2011
comment
Нет, я не имел в виду путь к вашему репозиторию svn. Я имел в виду указать полный путь к вашему svn-клиенту (svn.exe) в вашем вызове exec. - person anubhava; 03.06.2011
comment
О... да, это была проблема. По какой-то причине вставка c:\program files\...\svn сработала, тогда как просто наличие svn не сработало. Большое спасибо - person Aelfhere; 06.06.2011

AFAIU (из того, что я видел в подобных вопросах на форумах) перенаправление (>) не работает при использовании в Runtime.exec().

person Andrew Thompson    schedule 03.06.2011
comment
Действительно, перенаправление — это функция оболочки; см. также этот поток. - person trashgod; 04.06.2011

Следуйте советам здесь http://www.ensta-paristech.fr/~diam/java/online/io/javazine.html

Рассмотрим следующую строку кода:

Process p = Runtime.getRuntime().exec("/bin/sh -c > /bin/ls > ls.out");

Это предназначено для запуска оболочки Bourne и выполнения ею команды ls, перенаправляя вывод ls в файл ls.out. Причина использования /bin/sh заключается в том, чтобы обойти проблему перенаправления stdout внутренними компонентами Java. К сожалению, если вы попробуете это, ничего не произойдет. Когда эта командная строка передается методу exec(), она будет разбита на массив строк с элементами «/bin/sh», «-c», «/bin/ls», «>» и « ls.out". Это не удастся, так как sh ожидает только один аргумент для ключа "-c". Чтобы выполнить эту работу, попробуйте:

String[] cmd = {"/bin/sh", "-c", "/bin/ls > out.dat"};
Process p = Runtime.getRuntime().exec(cmd);

Поскольку командная строка уже является набором строк, строки будут просто загружены в массив команд методом exec() и переданы новому процессу как есть. Таким образом, оболочка увидит «-c» и команду «/bin/ls > ls.out» и выполнит их правильно.

Я предлагаю вам изменить вашу команду на

String[] cmd = {
  "cmd.exe",
  "/c",
  "c:\\path\\to\\svn log /location/ --xml > c:\\output.xml"
};
Process p = Runtime.getRuntime().exec(cmd);
person Alexander Pogrebnyak    schedule 03.06.2011