2011-10-10 88 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