Создать новый процесс в текущем окне консоли - PullRequest
1 голос
/ 10 октября 2011

У меня есть Java-приложение, которое, например, нуждается в перезапуске (но также и для запуска других процессов).В настоящее время это выполняется путем закрытия текущего приложения, а затем запуска нового экземпляра с использованием ShutdownHook и ProcessBuilder.

Моя проблема заключается в том, что новый процесс выполняется где-то в фоновом режиме и не имеет собственного окна консоли.На компьютерах с Windows новое консольное окно может быть создано с использованием

cmd /c start "windowtitle" java -jar myApp.jar

, но при этом создаются 2 процесса: процесс cmd и процесс java, запущенные командой start.Это, например, делает невозможным получение stdout и stderr запущенного процесса, потому что мы получаем эти потоки только для процесса cmd, а не для потока, запущенного командой start.

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

Ответы [ 2 ]

0 голосов
/ 22 февраля 2018

Я не знаю, если это то, что вы ищете, но это может помочь.

List<String> command = Arrays.asList("java", "-jar", "myApp.jar");
ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);
Process process = builder.start();

InputStream is = process.getInputStream();
final InputStreamReader isr = new InputStreamReader(is);
final BufferedReader br = new BufferedReader(isr);

String line = null;
while ((line = br.getLine()) != null) {
    System.out.println("child process: " + line);
}

process.waitFor();

builder.redirectErrorStream(true); перенаправит stderr на стандартный вывод, а цикл while запишет стандартный вывод дочернего процесса в стандартный вывод основного приложения. И не забудьте try catch Streams и Buffers

0 голосов
/ 15 июня 2012

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

#include <windows.h>
#include <tchar.h>

int main(int argc, char** argv)
{
  STARTUPINFO si = {sizeof(si)};
  PROCESS_INFORMATION pi = {};
  CreateProcess(NULL,_T("java -jar myApp.jar"),0,0,0,NORMAL_PRIORITY_CLASS,0,0,&si,&pi);
  return 0;
}
...