2011-10-10 53 views
1

我有一个Java应用程序,例如需要自行重启(但也需要启动其他进程)。这目前通过关闭当前的应用程序完成,然后使用ShutdownHook和ProcessBuilder启动一个新的实例。在当前控制台窗口中创建新进程

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

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

创建一个新的控制台窗口但是这创造了2个进程:该进程CMD和“启动”启动Java进程。这使得例如不可能获得已启动进程的stdout和stderr,因为我们只为cmd进程获取这些流,而不是由'start'命令启动的流。

对我来说,最好的解决办法是重新用于新工艺当前控制台窗口,但这个看起来有点不可能实现的,因为我没有找到如何做到这一点的任何信息。 此外,我将不胜感激在Unix机器上工作的解决方案。

回答

0

似乎,你应该使用小型控制台 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; 
} 
0

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

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);将标准错误重定向到标准输出和while循环将子进程的标准输出写入主应用程序的标准输出。而且不要忘了try catchStreamsBuffers

相关问题