考虑到我正在开发一个最终用户软件程序(作为 uberjar),我想知道我的选择是什么,可以让用户下载插件并在运行时加载该插件。
插件应该经过编译并且没有源代码,所以……就像 load
不是一个选项。
有哪些现有的库(或 Java 的方法...?)可以用来构建它?
编辑:如果您不确定,我也会对需要重新启动/启动主程序的方式感到满意。然而,重要的是源代码不会包含在任何 JAR 文件中(无论是主应用程序还是插件 jar,请参阅 Leiningen 文档的 :omit-source )。
最佳答案
要在运行时添加 jar,请使用 pomegranate,它允许您将 .jar 文件添加到类路径。软件的插件应该是常规的 Clojure 库,遵循您需要建立的某些约定:
让它们为实现构造函数/析构函数机制的对象提供(例如在
edn
中)符号,例如 Stuart Sierras component 库中的Lifecycle
协议(protocol)。在运行时,require
并resolve
该符号,start
生成的对象并将其交给您的程序插件协调工具。在您的程序中提供一个公共(public) API,允许插件以您异步协调的方式与其进行交互。 G。使用
clojure.core.async
(不要让一个插件阻塞整个程序)。确保插件有一种协调的方式,只有在他们愿意的情况下才能相互公开其功能,以便在插件之间实现高度的模块化。确保您的插件加载器能够检测插件之间的依赖关系,并能够以正确的顺序加载和卸载它们。
关于plugins - 在运行时加载插件的架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17969926/