Последовательное выполнение файлов JAR из программы Java - PullRequest
0 голосов
/ 10 января 2020

Я хочу выполнить несколько JAR-файлов последовательно, передавая ввод-вывод и читая вывод из них из одной Java программы. Я использовал этот код ниже, чтобы вызвать мой jar внутри моего java кода. Это приводит к нескольким экземплярам JVM, и выполнение jar не завершается, пока я не остановлю выполнение моей основной java программы.

Process pb = Runtime.getRuntime().exec("java -jar path/to/jar");
pb.waitFor();
BufferedReader ib = new BufferedReader(new InputStreamReader(pb.getErrorStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(pb.getInputStream()));

System.out.println(in.readLine());

Моя идеальная последовательность выполнения:

  • Main java (запускается)
  • JAR 1 (запускается и завершается)
  • JAR 2 (запускается и завершается)
  • Jar n ----
  • Main Java (останавливается)

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

1 Ответ

1 голос
/ 10 января 2020

Как только подпроцесс выдает больше выходных данных, чем возможность буферизации канала, он будет заблокирован, пока инициирующий процесс не прочитает данные. Когда вы ожидаете окончания подпроцесса перед чтением чего-либо, это может привести к тупику.

Поскольку вы только читаете вывод, чтобы перепечатать его на консоль (или вообще, пишете в stdout), вы может использовать ProcessBuilder, чтобы запретить использовать канал, но подключить подпроцесс 'stdio к вашему процессу' stdio:

Process pb = new ProcessBuilder("java", "-jar", "path/to/jar").inheritIO().start();
pb.waitFor();

Тогда вам не нужно ничего делать для передачи вывода подпроцесса на выходе вашего процесса, и нет никакого тупикового потенциала.

inheritIO() делает волхвы c. Это сокращение для .redirectInput(Redirect.INHERIT) .redirectOutput(Redirect.INHERIT) .redirectError(Redirect.INHERIT). Эти redirect… вызовы также можно использовать для настройки отдельных каналов для использования канала или чтения / записи в файл.

...