考慮到我正在開發一個終端用戶軟件程序(作爲uberjar),我想知道我的選項是什麼使得用戶可以下載插件並在運行時加載。插件在運行時加載的體系結構
該插件應該編譯並且沒有源代碼,所以......像load
不是一個選項。 現有的庫(或Java ...?的方式)存在以構建它?
編輯:如果你不確定我還會滿意的方式,重新啓動/開始的主要程序。然而,重要的是源代碼將不會被包含在任何JAR文件中(主應用程序和插件 - 罐子,請參閱:Leiningen文檔的omit-source)。
考慮到我正在開發一個終端用戶軟件程序(作爲uberjar),我想知道我的選項是什麼使得用戶可以下載插件並在運行時加載。插件在運行時加載的體系結構
該插件應該編譯並且沒有源代碼,所以......像load
不是一個選項。 現有的庫(或Java ...?的方式)存在以構建它?
編輯:如果你不確定我還會滿意的方式,重新啓動/開始的主要程序。然而,重要的是源代碼將不會被包含在任何JAR文件中(主應用程序和插件 - 罐子,請參閱:Leiningen文檔的omit-source)。
如果我試圖角色我自己的解決方案,我會嘗試使用tools.namespace裝載和卸載的插件。我不完全確定它會起作用,但它無疑是朝着正確的方向發展的。我認爲關鍵的一點是,插件罐必須「安裝」在類路徑中已經存在的位置上。
同樣,這只是一個可能解決方案的開始。我沒有試過這樣做。
當源代碼未包含在JAR中時,您確定tools.namespace.find是否有效? –
我還沒有嘗試過,但自述文件指出了tools.namespace。find包含「用於在文件系統,目錄或JAR文件中搜索Clojure命名空間的實用程序。結合java.classpath,它可以搜索Java類路徑上的命名空間。」 – Jeremy
不幸的是它無法找到沒有源代碼的JAR文件中的任何命名空間:( –
要在運行時添加jar,請使用pomegranate,它允許您將.jar文件添加到類路徑中。軟件的插件應該是跟隨你需要建立某種約定定期Clojure的庫:
讓他們提供(例如,在edn
)一個符號,一個對象實現構造/析構機制,如Lifecycle
協議在Stuart Sierras component庫中。在運行時,require
和resolve
表示符號,start
由此產生的對象並將它交給您的程序插件協調設施。
在您的程序中提供一個公共API,允許插件以異步協調的方式與它交互e。 G。與clojure.core.async
(不要讓一個插件阻止整個程序)。
確保插件具有相互協作的方式,只有當他們希望在插件中實現高度模塊化時,才能將其功能展現給對方。確保你的插件加載器能夠檢測插件之間的依賴關係,並且能夠以正確的順序加載和卸載它們。
OSGi似乎是Java的方式來做到這一點。 github repo的文檔記錄很糟糕,看起來源代碼看起來非常黑客。如果沒有什麼可比的話,我可能會自己爲OSGi編寫一個封裝器。 –