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/。

为了从Java调用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"));

然后,请使用相同的设施在需要的地方调用函数。

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