2009-01-06 81 views
5

在Java中,我可以動態添加東西到類路徑和加載類(「動態」的意思,而不必重新啓動我的應用程序)。有沒有一個已知的框架/庫處理模塊的動態加載/卸載而不重新啓動?在Java中動態加載模塊

通常的設置,尤其是Web應用程序,是負載均衡器,應用程序的多個實例以及新版本的逐步部署和重新啓動。我正在尋找其他的東西 - 包含多個服務/插件的應用程序,可能是單實例桌面應用程序,其中禁用單一服務很便宜,但是關閉或重新啓動整個應用程序並不可行。

我在考慮典型的插件基礎架構,其中插件可以升級或安裝而無需重新啓動應用程序。我是否必須從頭開始編程,還是已經有了一些東西? Spring兼容和開源是一個優點,但不是要求。

回答

9

您可能會考慮在OSGI framework中運行您的彈簧應用程序。

我相信DMServer是設計用於運行企業Java應用程序和基於Spring的應用程序,基於OSGI

您可以在此Hello, OSGi, Part 2: Introduction to Spring Dynamic Modules文章中找到更多的細節,特別是如何基於模塊的Java應用服務器使用Spring DM在正在運行的系統中動態安裝,更新和卸載模塊。


注:當你談及「插件可以升級或者重新啓動應用程序安裝」,OSGI是第一候選框架想到的。

這完全是關於應用程序模塊化成更小的包。
每個bundle都是一個緊密耦合的,可動態加載的類,jar和配置文件的集合,明確聲明它們的外部依賴項(如果有的話)。

3

也許最簡單的方法是使用它自己的類加載器加載每個插件。然後放棄類加載器並創建一個新的來重新加載插件。您需要在插件API中使用init()和destroy()方法以允許啓動/關閉類型功能。

這也有隔離插件的優勢。

URLClassLoader是您的出發點。一般的想法是你提供一個XxxPlugin超類,它是任何插件的子類。考慮Applet的例子,它基本上是一個GUI插件(或Midlet等)。