2013-07-31 34 views
5

考慮到我正在開發一個終端用戶軟件程序(作爲uberjar),我想知道我的選項是什麼使得用戶可以下載插件並在運行時加載。插件在運行時加載的體系結構

該插件應該編譯並且沒有源代碼,所以......像load不是一個選項。 現有的庫(或Java ...?的方式)存在以構建它?

編輯:如果你不確定我還會滿意的方式,重新啓動/開始的主要程序。然而,重要的是源代碼將不會被包含在任何JAR文件中(主應用程序和插件 - 罐子,請參閱:Leiningen文檔的omit-source)。

回答

1

我沒有嘗試過自己,但你理論上應該能夠得到OSGi與Clojure一起工作。

這裏有一個Clojure的/ OSGi的集成庫:

+0

OSGi似乎是Java的方式來做到這一點。 github repo的文檔記錄很糟糕,看起來源代碼看起來非常黑客。如果沒有什麼可比的話,我可能會自己爲OSGi編寫一個封裝器。 –

1

如果我試圖角色我自己的解決方案,我會嘗試使用tools.namespace裝載和卸載的插件。我不完全確定它會起作用,但它無疑是朝着正確的方向發展的。我認爲關鍵的一點是,插件罐必須「安裝」在類路徑中已經存在的位置上。

同樣,這只是一個可能解決方案的開始。我沒有試過這樣做。

+0

當源代碼未包含在JAR中時,您確定tools.namespace.find是否有效? –

+0

我還沒有嘗試過,但自述文件指出了tools.namespace。find包含「用於在文件系統,目錄或JAR文件中搜索Clojure命名空間的實用程序。結合java.classpath,它可以搜索Java類路徑上的命名空間。」 – Jeremy

+0

不幸的是它無法找到沒有源代碼的JAR文件中的任何命名空間:( –

4

要在運行時添加jar,請使用pomegranate,它允許您將.jar文件添加到類路徑中。軟件的插件應該是跟隨你需要建立某種約定定期Clojure的庫:

  1. 讓他們提供(例如,在edn)一個符號,一個對象實現構造/析構機制,如Lifecycle協議在Stuart Sierras component庫中。在運行時,requireresolve表示符號,start由此產生的對象並將它交給您的程序插件協調設施。

  2. 在您的程序中提供一個公共API,允許插件以異步協調的方式與它交互e。 G。與clojure.core.async(不要讓一個插件阻止整個程序)。

  3. 確保插件具有相互協作的方式,只有當他們希望在插件中實現高度模塊化時,才能將其功能展現給對方。確保你的插件加載器能夠檢測插件之間的依賴關係,並且能夠以正確的順序加載和卸載它們。