请在 2024 Clojure状态调查! 中分享您的想法。

欢迎!请参阅关于页面获取更多关于本站的工作方式的信息。

+1
... 编译器
编辑

假设你有一个已经包含Clojure的 .jar 的Java应用程序在类路径上。有一个文件目录 /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"));

然后使用相同的设施来调用函数。

by
如果无法将 `/home/me/clojure-extensions/` 添加到类路径中怎么办?因为这个目录不是应用程序的一部分。它也可以在应用程序中进行配置。应用也是以可部署的 .war 形式发布的,不包含扩展目录,该目录应由管理员提供。
by
我已看到过这种情况。但我需要加载一个文件及其同一路径下的所有依赖文件。看来,我必须在 JVM 进程已运行时扩展 Java 类路径,然后使用 Clojure API。
by
无法更改类路径,但您可以为您的应用程序创建一个新的类加载器上下文,这在其中包含额外的目录(参见 URLClassLoader)。执行此操作需要您首次实例化 Clojure 运行时(通过 Java API 中的 Clojure 类)以及在 Clojure API 返回的对象类时(因为应用程序上下文需要访问您返回的任何类)进行一些小心处理。特别是,如果您期望的不是内置的 Java 接口(Collection、List、Map、String 等等),我建议您创建 Java 接口,并返回这些接口的实例化对象。
...