2013-11-12 3 views
0

Im пытается запустить несколько команд оболочки в java. Вот мой код:Не удается запустить команды в java-коде

Process send = Runtime.getRuntime().exec(new String[] {"javac /tmp/"+ fileName + ";" + "sed -i 's/Foo/Foo2/g' /tmp/"+ fileName + ";" + "java /tmp/"+ fileNameShort + ".class;"}); 

Я знаю, что файлы находятся именно под папкой tmp, но ни одна из них не работает нормально.

имя файла: «Foo.java» fileNameShort: «Foo»

ответ

1

Вы выполняющиеся три команды подряд. Каждая команда должна быть отдельной Process. Кроме того, команда и параметры должны быть разбиты на элементы массива:

Process send1 = Runtime.getRuntime().exec(new String[] {"javac", "/tmp/"+ fileName}); 
send1.waitFor(); // this returns an int with the exit status of the command - you really should check this! 
Process send2 = Runtime.getRuntime().exec(new String[] {"sed", "-i", "s/Foo/Foo2/g", "/tmp/"+ fileName}); 
send2.waitFor(); 
Process send3 = Runtime.getRuntime().exec(new String[] {"java", "/tmp/"+ fileNameShort+".class"}); 
send3.waitFor(); 

С другой стороны, кормить всю вещь sh -c (хотя на самом деле, на самом деле следует использовать предыдущий метод, то вы не имеете беспокоиться о побеге аргументы и т.д.)

Process send = Runtime.getRuntime().exec(new String[] {"sh", "-c", "javac /tmp/"+ fileName + "; sed -i 's/Foo/Foo2/g' /tmp/"+ fileName + "; java /tmp/"+ fileNameShort + ".class"}); 
+0

Большое спасибо! Я использовал второе решение и работал. – birdcage

0
Runtime.getRuntime().exec 

не командная строка - вы не можете обрабатывать несколько команд одновременно, не может использовать редиректы и т.д. ...

1

Нет, вы не можете этого сделать, так как этот метод:

Выполняет указанную команду строки в отдельном процессе.

Лучше создать сценарий оболочки и вызвать этот скрипт:

Process pr = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", "/path/script.sh"}); 
0

вы можете запустить 3 команды в ряд, как вы делаете, но тогда вы должны передать их в Баш (или другой оболочки) для запуска. Как отмечали другие люди, вы можете запускать только один процесс ОС на вызов exec(). Поэтому сделайте этот процесс bash и дайте ему средства для запуска процессов, которые вам нужны. Или просто запустите 3 процесса, как указал другой пользователь.

Тогда ваша проблема становится башкой.

Например, следующее:

echo -e "echo 'AAA'; for x in 1 2 3; do echo 'BBB'; done; echo 'CCC'" | bash

Напечатает

AAA 
BBB 
BBB 
BBB 
CCC 

Это на самом деле 3 процессы, которые вы можете запустить все это в одном Exec().

Теперь о проблеме, которую вы пытаетесь решить, похоже, вы хотите изменить байт-коды. Я бы рекомендовал использовать для этого библиотеку. Взгляните на ASM: http://asm.ow2.org/

Смежные вопросы