plugins - 在运行时加载插件的架构

标签 plugins clojure runtime

考虑到我正在开发一个最终用户软件程序(作为 uberjar),我想知道我的选择是什么,可以让用户下载插件并在运行时加载该插件。

插件应该经过编译并且没有源代码,所以……就像 load 不是一个选项。 有哪些现有的库(或 Java 的方法...?)可以用来构建它?

编辑:如果您不确定,我也会对需要重新启动/启动主程序的方式感到满意。然而,重要的是源代码不会包含在任何 JAR 文件中(无论是主应用程序还是插件 jar,请参阅 Leiningen 文档的 :omit-source )。

最佳答案

要在运行时添加 jar,请使用 pomegranate,它允许您将 .jar 文件添加到类路径。软件的插件应该是常规的 Clojure 库,遵循您需要建立的某些约定:

  1. 让它们为实现构造函数/析构函数机制的对象提供(例如在 edn 中)符号,例如 Stuart Sierras component 库中的 Lifecycle 协议(protocol)。在运行时,requireresolve 该符号,start 生成的对象并将其交给您的程序插件协调工具。

  2. 在您的程序中提供一个公共(public) API,允许插件以您异步协调的方式与其进行交互。 G。使用 clojure.core.async (不要让一个插件阻塞整个程序)。

  3. 确保插件有一种协调的方式,只有在他们愿意的情况下才能相互公开其功能,以便在插件之间实现高度的模块化。确保您的插件加载器能够检测插件之间的依赖关系,并能够以正确的顺序加载和卸载它们。

关于plugins - 在运行时加载插件的架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17969926/

相关文章:

java - 来自java的外部程序不会终止

java - Ant 插件任务 IntelliJ java.lang.OutOfMemoryError

java - Elasticsearch插件ThreadPermission安全异常

javascript - 删除父元素并重新 append 子元素

clojure - 返回以特定频率出现的第一个元素

clojure - 从 Clojure 中的嵌套结构中获取的惯用方法

wordpress - 多合一 seo 包和 qtranslate 标题属性

clojure - 在 Clojure 中重新定义记录的字段

javascript - 加载图表后 Highstock 更改 xAxis minRange

java - 如何在 CMD 中打开程序并使用 Java 与其交互