2009-08-05 64 views
1

我在寫一個自我更新的應用程序。它首次運行時,會在客戶端的計算機上安裝本機庫,以便它們不需要每次都下載它。當它檢測到已安裝的磁帶庫的版本比新要求的最低版本舊時,它會下載並安裝新版本。如何替換Java Applet中加載的動態庫,而不需要重新啓動瀏覽器?

問題是,直到用戶關閉並重新啓動瀏覽器(不是選項卡,整個瀏覽器)之後,新庫才被Java實際使用。這是我試圖避免的 - 如果用戶需要刷新頁面,或者關閉並重新打開,那也可以。

我已經嘗試將安裝的庫複製到臨時文件夾,每次小程序啓動,然後始終加載該副本,無濟於事。有沒有人曾經這樣做過?任何好主意?操作系統是Linux,JDK 1.5,Firefox。

謝謝!

回答

1

這也正是這個bug報告中所描述的情況: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5075039 (該報告說,它適用於Windows,但它實際上是一個Java問題)

沒有辦法爲Java代碼卸載本地的dll直到VM終止。一旦加載了一個dll,它就在JVM的生命週期中,並且VM將確保它只加載一次。

我可以看到您的方案工作的唯一方法是,如果您可以以某種方式執行您的版本檢查並在之前更新dll被加載。一旦它被使用,你就會陷入困境。

0

Java類只能通過卸載擁有它們的類加載器來卸載。由於JNI庫依賴於擁有的類,因此可能需要卸載擁有該庫的類的類加載器。

嘗試實例化與JNI庫接口的類的URLClassLoader,並使用反射創建有問題的類的實例。當你想卸載它時,從更新的JAR中創建一個新的類加載器,它引用了新版本的庫(使用不同的庫文件名,這樣你可以同時加載兩個版本,直到GC處理舊版本)

相關問題