2015-01-04 51 views
-4

我有一個更新程序,它將下載一個.jar文件 - 如果它是新的,然後退出應用程序,然後用更新的文件替換.jar文件,然後用戶將能夠執行該更新的版本?如何用新的替換現有的.jar文件?

我該如何去做這件事?

+0

通過啓動Java IDE並對其進行編程。這個答案對你有幫助嗎?沒有?然後,請更具體地說明您描述的哪一步需要幫助,以及您需要知道什麼。 – Philipp 2015-01-04 11:46:29

+0

http://hellotojavaworld.blogspot.nl/2010/11/runtimeaddshutdownhook.html將你的複製命令放在那 – Charlie 2015-01-04 11:46:41

回答

0

我想你在覆蓋當前正在使用的文件時遇到問題?這在很大程度上取決於操作系統:在Windows上,Java會鎖定當前正在使用的所有jar文件,因此不可能覆蓋。在Linux上,可能會覆蓋,但是因爲Java不會將整個文件複製到RAM中,所以可能會發生代碼在某個階段失敗的情況,因爲從文件中加載新類是不可能的(這很可能發生在一個類的AskShutdownDialog的例子,它只會在關機時使用)。我不知道MacOS,但我認爲嘗試它並不是一個好主意。

有許多技巧來解決這個問題:

  • 您可以使用一個輔助應用程序:使用java -jar updatehelper.jar調用啓動它,然後退出主應用程序。 UpdateHelper將等待您的應用程序退出,然後替換文件(您之前下載並驗證的文件),並使用另一個Java調用再次啓動主應用程序。

  • 您還可以使用命令行腳本作爲幫手,但至少在Windows上它不是很容易開發和所需的操作系統特定的腳本

這個選項都需要特定的一些操作系統代碼,至少要找到你的java二進制文件再次啓動主應用程序。這可能會導致問題(不僅)未經驗證的操作系統

  • 一個完全不同的方式來實現裝載機。這是一個很長時間不會改變的小型jar文件。這個Loader可以嘗試找到你當前的版本,例如從配置文件中加載主jar的名字,例如:MyMain-1.01.jar(這是一個好主意,將整個類路徑保存在這個文件中,並指定名稱主類,你還需要一個自己的類加載器)。然後它加載這個文件並調用其中的真正主類。有了這個設置,你不需要任何與操作系統相關的代碼,但是你需要知道你的Loader至少會在Windows中被鎖定。但即使如此,您仍然可以選擇在更新版本的應用程序中引入UpdateHelper。 我曾經使用這個選項,並有一個非常穩定的更新概念。加載器顯示帶有進度條的啓動畫面,並直接從Web服務器下載更新。如果你想要這樣的東西,你也應該考慮使用Java WebStart

  • 還有熱部署的選項,這意味着你在運行時卸載一個jar文件。但是這需要一個非常模塊化的應用程序設計,並且模塊之間不需要很多引用這是像Tomcat,Jetty,JBoss等應用服務器和網絡服務器的領域,它們使用單​​獨的類加載器。從頭開始實施這並不容易。

相關問題