2024年度Clojure调查 中分享您的想法!

欢迎!请查看关于页面以了解更多关于该平台如何工作的信息。

+1
编译器
编辑

给定一个Java应用程序,其中类路径已有Clojure的.jar文件。还有一个文件目录/home/me/clojure-extensions/,其中包含.clj文件,其结构类似于一个普通的Clojure源目录,不在应用程序的类路径上,也无法将其添加到类路径,因为它是可以配置的,并非应用程序的一部分。

如何从Java代码中调用函数 myns.core/myfn?以便加载/home/me/clojure/extensions/myns/core.clj及其所有依赖文件?以便在Java调用再次发起时,如果这些文件被更改则重新加载这些文件?

1 答案

0

根据您描述的场景,您需要将/home/me/clojure-extensions/添加到类路径中。

要调用Clojure,您可以使用Java API

https://clojure.github.io/clojure/javadoc/clojure/java/api/Clojure.html

对于重载,您需要通过Java API调用来明确表示

(require 'whatever :reload-all)

该调用将类似于以下内容

// this can be done once, statically
IFn require = Clojure.var("clojure.core", "require");

// to reload
require.invoke(Clojure.read("whatever"), Clojure.read(":reload-all"));

然后使用相同的工具来调用任何函数。

by
如果无法将`/home/me/clojure-extensions/`添加到类路径,那么怎么办?因为它不是应用程序的一部分。这也可以在应用程序中进行配置。应用程序以可部署的.war文件的形式发布,其中不包含扩展目录,该目录应由管理员提供。
by
我已见过这种情况。但我需要加载一个文件以及同一路径下的所有依赖文件。看来,我必须扩展Java类路径,当JVM进程已经运行时,然后使用Clojure API。
by
您不能改变类路径,但您可以在应用程序内部创建一个新的类加载器上下文来运行,其中包括额外的目录(见表URLClassLoader)。这样做将需要一些细心,首先如何实例化Clojure运行时(通过Java API中的Clojure类)以及从Clojure API返回的对象的类(因为应用程序上下文需要访问您返回的任何类)。特别是,如果您期望的是除内置Java接口以外的其他内容(如集合、列表、映射、字符串等),我建议创建Java接口并返回这些接口的具体实例。
...