我有一个Java应用程序,例如需要重启(但也需要启动其他进程)。这是通过关闭当前应用程序然后使用ShutdownHook和ProcessBuilder启动新实例来完成的。
我现在的问题是新进程在后台运行,并且没有自己的控制台窗口。在Windows机器上,可以使用
创建新的控制台窗口cmd /c start "windowtitle" java -jar myApp.jar
但是这创建了两个进程:cmd进程和由'start'启动的java进程。这使得例如无法获取已启动进程的stdout和stderr,因为我们只获取cmd进程的那些流,而不是“start”命令启动的那些流。
对我来说最好的解决方案是为新进程重用当前的控制台窗口,但这似乎无法实现,因为我没有找到有关如何执行此操作的任何信息。 另外,我很感激一种适用于Unix机器的解决方案。
答案 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