[英]Reloading jar files contents dynamically
我的應用程序的類路徑中有一個 jar 文件。 在運行時,我將新類添加到 jar 文件中,有時還會修改現有類的字段/方法。 目前我正在使用 URLClassLoader 動態加載類。 動態添加的新類已正確加載,我可以在運行時使用它們。 但它無法重新加載在運行時修改的現有類。 我閱讀了許多文章,其中指出我們需要明確處理重新加載,因為一旦加載的類在所有對該類的引用都被銷毀之前不會重新加載。 我還嘗試了我發現的示例代碼,但沒有一個工作。
誰能建議我重新加載的正確方法? 任何相同的示例代碼都將受到高度贊賞。
通常要重新加載一個類,您需要卸載整個類加載器。 即刪除對為該類加載器加載的所有類的所有引用。
另一種選擇是使用檢測來更改現有類的字節碼。 這通常會帶來限制,而更改字段是您無法做到的。 即該類型的對象必須以某種方式進行翻譯。
我通常做的是提供啟動/重啟非常快的服務。 通過在我的 IDE 中按Run
,您可以輕松地重新啟動需要更新代碼的進程。 這也最大限度地減少了部署時間。
URLClassLoader
有一個問題,那就是 jar 文件保持打開狀態。URLClassLoader
的不同實例從一個 jar 文件加載了多個類,並且您在運行時更改了 jar 文件,您通常會收到以下錯誤: java.util.zip.ZipException: ZipFile invalid LOC header (bad signature)
。 錯誤可能不同。URLClassLoader
使用close
方法。 但這是一個實際上會導致整個應用程序重新啟動的解決方案。 更好的解決方案是修改URLClassLoader
以便將 jar 文件的內容加載到 RAM 緩存中。 這不再影響從同一個 jar 文件讀取數據的其他URLClassloader
。 然后可以在應用程序運行時自由更改 jar 文件。 例如,您可以為此目的使用URLClassLoader
這種修改: in-memory URLClassLoader
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.