5

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

插件应该被编译并且没有源代码,所以...... 喜欢load不是一种选择。有哪些现有的库(或 Java 的方法......?)可以在此基础上构建它?

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

4

3 回答 3

5

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

  1. 使它们为edn实现构造函数/析构函数机制的对象(例如在 中)提供符号,例如LifecycleStuart Sierras组件库中的协议。在运行时,requireresolve那个符号一样,start生成的对象并把它交给你的程序插件协调设施。

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

  3. 确保插件有一种协调的方式来相互公开它们的功能,只有当它们希望这样才能在你的插件之间实现高度的模块化时。确保您的插件加载器能够检测插件之间的依赖关系,并能够以正确的顺序加载和卸载它们。

于 2014-01-09T23:10:58.747 回答
1

我自己没有尝试过,但理论上你应该能够让OSGi与 Clojure 一起工作。

这里有一个 Clojure / OSGi 集成库:

于 2013-07-31T14:51:10.403 回答
1

如果我要尝试扮演自己的解决方案,我会尝试使用tools.namespace来加载和卸载插件。我不完全确定它会起作用,但它肯定是朝着正确的方向发展的。我认为一个关键部分是插件 jar 必须“安装”在已经在类路径上的位置。

同样,这只是一种可能的解决方案的开始。我没有尝试过这样做。

于 2013-07-31T15:19:35.933 回答