2012-01-18 82 views
0

我正在開發一個網絡應用程序,其中有一個客戶端和服務器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(),但沒有成功。有沒有人見過這樣的事情?

回答

0

事實證明,這是(在64位Windows 7企業版中運行)用Java 1.7.0_01中的錯誤。我更新到Java 1.7.0_02,問題消失了。我已經提交給Sun的bug報告,這裏的鏈接到報告:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7131522

這可能需要一兩天的鏈接變得活躍,但希望人們用同樣的情況可以按照在這份報告上取得進展並相應解決他們的問題

1

我沒有看過你的文章,但讀When Runtime.exec() won't - JavaWorld

+0

是啊,我通過之前閱讀 - 無這篇文章中的案例與這裏發生的事情類似。我的父進程沒有掛起或轉儲堆棧跟蹤,它在調用ProcessBuilder.start()時立即退出。我也沒有使用Runtime.getRuntime()。exec(),因爲Java中派生進程的偏好首選方法是使用ProcessBuilder,每個Java API。好文章雖然! – CodeBlind 2012-01-18 19:39:23

1

可悲的是通過Farmor提到的錯誤已被關閉

國家11封閉,不可重複,錯誤 優先級:4 - 低

+0

是的,我懷疑他們可能會這樣做。我認爲他們認爲,因爲你可以通過將Java更新到最新版本來解決這個問題,他們只是不會在舊版本中修復它。讓我有些le然心動,因爲現在我要告訴我的所有客戶不要在Java 1.7.0_01中使用我的軟件......哦,你得到你所支付的東西,我想...... :) – CodeBlind 2012-02-01 23:34:02