Plugins 运行时加载插件的体系结构

Plugins 运行时加载插件的体系结构,plugins,clojure,runtime,Plugins,Clojure,Runtime,考虑到我正在开发一个终端用户软件程序(作为uberjar),我想知道我的选择是什么,让用户能够下载插件并在运行时加载它 插件应该是编译好的,并且没有源代码,所以像load这样的东西不是一个选项。 现有的哪些库(或Java的方式…?)可以用来构建它 编辑:如果您不确定我是否会对重新启动主程序的方式感到满意。然而,重要的是源代码不会包含在任何JAR文件中(无论是主应用程序还是插件JAR,请参阅:省略Leiningen文档的源代码) 我自己也没有试过,但理论上你应该可以和Clojure一起工作 这里有

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

插件应该是编译好的,并且没有源代码,所以像
load
这样的东西不是一个选项。 现有的哪些库(或Java的方式…?)可以用来构建它


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

我自己也没有试过,但理论上你应该可以和Clojure一起工作

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


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


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

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

  • 使它们(例如在
    edn
    中)向实现构造函数/析构函数机制的对象提供符号,如Stuart Sierras库中的
    生命周期
    协议。在运行时,
    要求
    解析
    该符号,
    启动
    生成的对象,并将其交给其他程序

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

  • 确保插件之间有一种协调的方式来相互公开它们的功能,前提是它们希望在插件之间实现高度的模块化。确保插件加载器能够检测插件之间的依赖关系,并且能够以正确的顺序加载和卸载插件


  • 您确定tools.namespace.find在源代码未包含在JAR中时是否有效吗?我没有尝试过,但自述文件中指出tools.namespace.find包含“用于在文件系统、目录或JAR文件中搜索Clojure命名空间的实用程序。与java.classpath结合使用,它可以在java类路径上搜索命名空间。”不幸的是,如果没有源代码,它在JAR文件中找不到任何名称空间:(似乎OSGi是Java的实现方式。github repo的文档记录非常糟糕,从源代码看似乎非常粗糙。如果没有可比性,我可能会自己为OSGi编写一个包装器。