2016-06-03 6 views
0

Я успешно использовал AutoIt для выполнения команд, но я думал, что смогу получить более стабильную реализацию через Runtime. Таким образом, я знаю, что команды всегда будут выполняться и не будут выбрасываться исключениями прерывания и другим случайным дерьмом. Есть ли что-то в Runtime, что я не знаю, что не позволит непрерывное выполнение команд? У него нет памяти для выходов предыдущих команд, т. Е. Не работает ли она в постоянной командной строке?Выполнение команд с использованием Java Runtime

Следующие команды перемещаются в папку и выполняют сценарий Maven. Как мне заставить это работать? Если бы было еще 10 команд, выполняемых в том же процессе?

sendCommand("cmd.exe cd homepath/plugins"); 
sendCommand("mvn archetype:generate -DarchetypeCatalog=file://homepath/.m2/repository"); 

private static void sendCommand(String text) throws IOException { 
    Runtime.getRuntime().exec(text); 
} 

ответ

1

Несколько вещей.

  1. Вместо этого вы должны использовать Process и ProcessBuilder.
  2. Команды должны быть разделены и обозначены в соответствии с аргументами.
  3. Как вы его написали, эти две команды не будут выполняться в том же процессе.
  4. К счастью для вас, ProcessBuilder поддерживает изменение рабочего каталога команды в любом случае.

В качестве примера:

sendCommand("homepath/plugins", "mvn", "archetype:generate", "-DarchetypeCatalog=file://homepath/.m2/repository"); 

private static void sendCommand(String workingDirectory, String... command) throws IOException { 
    Process proc = new ProcessBuilder(command).directory(new File(workingDirectory)).start(); 
    int status = proc.waitFor(); 
    if (status != 0) { 
     // Handle non-zero exit code, which means the command failed 
    } 
} 

Обратите внимание, как а) команда была разделена, и б) что рабочий каталог передается в систему и установить с помощью ProcessBuilder.directory(File). Это даст вам желаемое поведение, но обратите внимание, что каждая команда будет по-прежнему отдельным процессом, и нет возможности объединить их с Java. Вам нужно будет использовать функции Maven, чтобы заставить их всех запускаться сразу, указав несколько целей сборки.

+0

Как насчет этого? http://stackoverflow.com/a/18867097 Похоже, я могу добавить && между командами, чтобы запустить их все в одном процессе? – santafebound

+0

@bluemunch Это объединит их все в одну команду, но не объединит их в один идентификатор процесса. Теперь он * будет * объединять их все в один «java.util.Process». Если это то, что вы подразумеваете под одним процессом, то '&&' будет работать идеально для вас. – Brian

2

Runtime.exec() возвращает экземпляр процесса. Вызовите waitFor() для этого объекта, чтобы подождать, пока он не будет завершен, прежде чем запускать следующую команду. Вы можете общаться с процессом через его методы getInputStream()/getOutputStream().

Также читайте Javadoc. В Runtime.exec говорится: «Выполняет указанную команду строки в отдельном процессе ».

+0

Хорошо, если мой скрипт говорит 20 команд, тогда я хочу, чтобы все они были в одном процессе exec? – santafebound

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