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接口并返回这些接口的实现实例。
...