在当前控制台窗口中创建一个新进程

时间:2011-10-10 09:25:42

标签: java console window build-process

我有一个Java应用程序,例如需要重启(但也需要启动其他进程)。这是通过关闭当前应用程序然后使用ShutdownHook和ProcessBuilder启动新实例来完成的。

我现在的问题是新进程在后台运行,并且没有自己的控制台窗口。在Windows机器上,可以使用

创建新的控制台窗口
cmd /c start "windowtitle" java -jar myApp.jar

但是这创建了两个进程:cmd进程和由'start'启动的java进程。这使得例如无法获取已启动进程的stdout和stderr,因为我们只获取cmd进程的那些流,而不是“start”命令启动的那些流。

对我来说最好的解决方案是为新进程重用当前的控制台窗口,但这似乎无法实现,因为我没有找到有关如何执行此操作的任何信息。 另外,我很感激一种适用于Unix机器的解决方案。

2 个答案:

答案 0 :(得分:0)

似乎,你应该使用小的 console program-starter for 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;
}

答案 1 :(得分:0)

我不知道这是不是你想要的,但它可能会有所帮助。

${ID},${Name},${Age}

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(); 会将stderr重定向到stdout,而while循环会将子进程的stdout写入主应用程序的stdout。并且不要忘记builder.redirectErrorStream(true);try catch

Streams