簡體   English   中英

動態重新加載 jar 文件內容

[英]Reloading jar files contents dynamically

我的應用程序的類路徑中有一個 jar 文件。 在運行時,我將新類添加到 jar 文件中,有時還會修改現有類的字段/方法。 目前我正在使用 URLClassLoader 動態加載類。 動態添加的新類已正確加載,我可以在運行時使用它們。 但它無法重新加載在運行時修改的現有類。 我閱讀了許多文章,其中指出我們需要明確處理重新加載,因為一旦加載的類在所有對該類的引用都被銷毀之前不會重新加載。 我還嘗試了我發現的示例代碼,但沒有一個工作。

誰能建議我重新加載的正確方法? 任何相同的示例代碼都將受到高度贊賞。

通常要重新加載一個類,您需要卸載整個類加載器。 即刪除對為該類加載器加載的所有類的所有引用。

另一種選擇是使用檢測來更改現有類的字節碼。 這通常會帶來限制,而更改字段是您無法做到的。 即該類型的對象必須以某種方式進行翻譯。

我通常做的是提供啟動/重啟非常快的服務。 通過在我的 IDE 中按Run ,您可以輕松地重新啟動需要更新代碼的進程。 這也最大限度地減少了部署時間。

  1. 原則上,已經加載的類不能用同一個類加載器重新加載。
  2. 對於新的加載,需要創建一個新的類加載器,從而加載該類。
  3. 使用URLClassLoader有一個問題,那就是 jar 文件保持打開狀態。
  4. 如果您通過URLClassLoader的不同實例從一個 jar 文件加載了多個類,並且您在運行時更改了 jar 文件,您通常會收到以下錯誤: java.util.zip.ZipException: ZipFile invalid LOC header (bad signature) 錯誤可能不同。
  5. 為了不發生上述錯誤,必須使用給定的 jar 文件對所有URLClassLoader使用close方法。 但這是一個實際上會導致整個應用程序重新啟動的解決方案。

更好的解決方案是修改URLClassLoader以便將 jar 文件的內容加載到 RAM 緩存中。 這不再影響從同一個 jar 文件讀取數據的其他URLClassloader 然后可以在應用程序運行時自由更改 jar 文件。 例如,您可以為此目的使用URLClassLoader這種修改: in-memory URLClassLoader

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM