2010-09-01 114 views
5

我正在構建一個更新系統,我需要能夠在運行時替換正在運行的應用程序jar的引用jar。但是,當我嘗試在jar上執行文件實用程序函數(例如'setLastModified')時,我遇到了Windows上的文件鎖定問題。在運行時交換運行的jar

一些谷歌上搜索,我發現這個片段後...

我在研究中發現,那是什麼 標準的ClassLoader 實施從未關閉一個jar文件 一旦被打開。它也 只根據需要從jar文件 加載資源。因此在任何特定時間, 可能存在尚未加載到內存中的jar文件 中的類。 顯然,如果您從ClassLoader下刪除了jar文件 ,並且它 試圖在 缺少的文件中查找資源,那麼至少會得到一個012xxIOException。

有沒有人有任何提及這方面的信息或解決此問題?

謝謝。

+0

你需要重新發明輪子嗎? OSGi已經有了熱門的部署。看一看,看看你是否可以用它來代替。 – SteveD 2010-09-01 19:41:27

+0

OSGi聽起來像絕大多數要求壓倒一切,看看這個答案http://stackoverflow.com/a/2463978/320594 – 2014-03-08 09:20:28

+0

重新閱讀後,似乎你想保持你的應用程序運行,但與新的罐子......所以OSGi真的看起來像一個很好的解決方案:),例如Eclipse允許(插件在運行時重新加載)並使用OSGi(只要我知道)。 – 2014-03-08 09:23:31

回答

5

有很多關於類/ lib目錄熱插拔解決方案:

這取決於你想要做什麼。

+2

OSGi是巨大的,JRebel僅用於開發,因爲它需要昂貴的許可證(免費用於OSS項目)。不確定螞蟻的Hotswap – TheLQ 2010-09-01 20:52:03

2

最接近的事是OSGi

請看看混凝土製品提到條每頁的「參見」部分。

0

我不知道有什麼好辦法來解決這個問題。創建自定義類加載器可能是一個選項,但我不喜歡這個想法。

我們通過在啓動主應用程序之前從單獨的jar運行更新程序來解決它。這很好,但顯然,只能在應用程序啓動時更新jar。