2011-12-03 27 views
0
  1. 檢查服務器是否有包含更新的目錄。
  2. 將jar下載到當前應用程序目錄。
  3. 通知用戶重新啓動應用程序。

我的問題是在Java應用程序運行時覆蓋舊文件。如何編寫Java Swing self updater(非Java Web Start解決方案)?

例如myapp.jar和其他庫jar已更新,需要將新版本下載到當前應用程序目錄中並在過程中覆蓋它。有沒有辦法做到這一點?它會允許覆蓋嗎?

+3

我不明白這個問題與您之前投票結束的問題有什麼實質性的不同。投票結束這一個。 –

+0

需要一些解釋爲什麼這需要關閉。我的問題與http://stackoverflow.com/questions/4706153/how-to-write-a-self-updating-program-in-java有什麼不同? – KJW

+0

這個問題並不排除使用JWS(1)的**顯而易見的答案。我覺得你很快就會解僱JWS。當然,這就是爲什麼*我*選擇將問題貼近標籤的原因,我不能爲其他人說話。 1)事實上,* [接受的答案](http://stackoverflow.com/a/4706165/418556)*歸結爲*「使用JWS」*。 –

回答

1

你不能指望能夠覆蓋jar文件。它可能適用於Linux,但絕對不適用於Windows。

解決此問題的一種方法是將jar下載到臨時位置,然後在啓動時(在JVM啓動之前)將temp jar移動到應用程序下載位置,然後啓動。注意:您需要在下載後以某種方式驗證罐子的內容,以確保它們沒有損壞。一個md5sum將工作。

+0

如果JVM尚未啓動,我該如何才能將temp jar移動到應用程序位置? – KJW

+0

腳本,可執行文件,在另一個Jar上運行的另一個JVM。有很多方法。 – Bill

+0

所以我打算做一些事情,比如創建一個單獨的updater.jar並從myapp.jar運行。如果檢測到更新,它將要求關閉myapp.jar並根據需要繼續下載和更新文件。 – KJW

2

有沒有辦法做到這一點?

我這樣期待。但它的工作使其工作。嚴重的是,共識是你正在重新發明輪子。

它會允許覆蓋嗎?

您不能依賴於能夠覆蓋正在使用的JAR文件,因爲您正在執行它。

有很多方法可以解決這個問題,但他們歸結爲有一些自定義啓動器,負責下載,更新等等,然後啓動或重新啓動您的真實應用程序。而且,基本上,這就是JNLP所做的......因此,你提出要重新發明車輪的觀察。 (我會補充一點,這些方式對我來說很明顯,如果它們對你不明顯,那是你使用JNLP更好的另一個原因,否則你可能會以方形車輪)。