Java Runtime.exec работает в Linux - PullRequest
5 голосов
/ 30 марта 2011

Привет, ребята.Я работаю над программой на Java, предназначенной для использования в среде Linux, которая создает новый процесс Java, который запускает другой класс Java, но у меня возникли проблемы с этим.Я наконец исправил все свои проблемы до этого.Вызов

Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'" })

в моей Java-программе возвращает

/bin/bash: /usr/lib/jvm/java-6-openjdk/jre/bin/java -classpath /home/kevin/workspace/Misc/bin HelloWorld: No such file or directory

в любом stdout / stderr.Если я попытаюсь

Runtime.getRuntime().exec(new String[] { "/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'" })

, я получу исключение Java

Cannot run program "/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'": java.io.IOException: error=2, No such file or directory
     ...
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory

И, наконец, использование простого

Runtime.getRuntime().exec("/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'")

даст мне

-classpath: -c: line 0: unexpected EOF while looking for matching `''
-classpath: -c: line 1: syntax error: unexpected end of file

из stdout / stderr.

Между тем, создается новый однострочный файл .sh (и назначаются соответствующие разрешения) только с этим (без #! / Bin / bash в верхней части файла)

/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'

дает правильный вывод без ошибок.

Я понимаю, что использование Runtime.exec довольно сложно усовершенствовать, и я уже решил некоторые большие проблемы, которые я получил от него раньше, но этоЭта проблема просто озадачивает меня (например, использование Runtime.exec StringTokenizer, приводящего к порче любых команд с пробелами в них, поэтому я вызвал перегрузку, которая принимает массивы String).Однако у меня все еще есть проблемы, и я не понимаю, почему.

1 Ответ

11 голосов
/ 30 марта 2011

Ваша первая попытка была почти правильной.

Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "java -classpath /home/kevin/workspace/Misc/bin HelloWorld" })

Вам не нужны дополнительные кавычки, потому что передача отдельных аргументов String автоматически приводит их в кавычки.

...