我正在開發一個網絡應用程序,其中有一個客戶端和服務器JVM,這兩個應用程序都應該依賴於一組相同的jar,可能存儲或不存儲在相同的位置。在連接到服務器後,客戶端立即將其罐子的MD5總和與服務器上的罐子進行比較。如果MD5 Sums不匹配,則客戶端會將服務器的jar下載到一個新文件夾中,並嘗試生成一個新的Process
,該新的文件夾不依賴於客戶端當前正在使用的任何jar,然後退出。然後,這個新的Process
應該覆蓋客戶端的jar文件,並將客戶端保存到上面提到的新文件夾的服務器副本覆蓋掉,然後退出。ProcessBuilder.start()導致主機JVM退出
問題是,無論客戶端何時嘗試啓動新進程,客戶端的JVM都會以靜默方式退出。下面是滋生新Process
代碼:
System.err.println("##### creating ProcessBuilder ...");
ProcessBuilder pb = new ProcessBuilder();
System.err.println("##### setting command line args ...");
pb.command("java","-jar","some-jar-not-used-by-the-client.jar");
System.err.print("##### starting ProcessBuilder: ");
for(String opt : pb.command()) System.err.print(opt+" ");
System.err.println();
pb.start();
System.err.println("##### Process started, exiting host process ...");
客戶出現在呼叫pb.start()
要退出。下面是我的程序的控制檯輸出:
##### creating ProcessBuilder
##### setting command line args
##### starting ProcessBuilder: java -jar some-jar-not-used-by-the-client.jar
print語句後pb.start()
不會被調用。我已經在Java 6和Java 7中測試過了,我也嘗試過使用Runtime.getRuntime().exec()
,但沒有成功。有沒有人見過這樣的事情?
是啊,我通過之前閱讀 - 無這篇文章中的案例與這裏發生的事情類似。我的父進程沒有掛起或轉儲堆棧跟蹤,它在調用ProcessBuilder.start()時立即退出。我也沒有使用Runtime.getRuntime()。exec(),因爲Java中派生進程的偏好首選方法是使用ProcessBuilder,每個Java API。好文章雖然! – CodeBlind 2012-01-18 19:39:23