在clojure中创建一个插件系统

时间:2016-08-24 15:46:01

标签: java clojure jvm lisp

我想知道是否可以以及如何实施模块系统。

以下是它如何工作的示例:我有一些文件夹(例如modules),这个文件夹有一堆clojure文件,可以导出一些变量(例如nameregex),所有模块都加载到一个列表中,因此可以迭代并从中删除模块。

2 个答案:

答案 0 :(得分:2)

您可以做的最简单的事情是使用load-file逐个加载所有这些文件。 https://clojuredocs.org/clojure.core/load-file

否则你可以预编译插件的命名空间并使用一些java的本机技术加载它们(我不太了解它,但我想有一些很好的库)

<强>更新 对于名为“/ my / path”的某个目录,它可能如下所示:

(run! #(load-file (.getAbsolutePath %))
      (rest (file-seq (java.io.File. "/my/path"))))

请注意,file seq以递归方式遍历目录,并包含所有文件(不仅仅是*.clj)。也许你必须过滤它们:

(run! #(load-file (.getAbsolutePath %))
      (filter
       #(clojure.string/ends-with? (.getName %) ".clj")
       (rest (file-seq (java.io.File. "/my/path")))))

答案 1 :(得分:0)

riemann,有一个插件系统设计,可以通过其初始化脚本将jar文件加载到类路径中。这些功能允许遍历类路径,查找随插件一起分发的小型元文件,以提示需求。