在《2024年Clojure状态调查》中分享您的观点!!

欢迎!请参阅关于页面,了解更多关于如何工作的信息。

+1
编译器
编辑

假设有一个Java应用已经在classpath上存在Clojure的.jar文件。并且有一个文件目录/home/me/clojure-extensions/包含了.clj文件,结构等同于一个普通的Clojure源代码目录,它不在应用的classpath中,且不能加入classpath,因为它可配置且不是应用的一部分。

如何从Java代码调用函数myns.core/myfn?以便加载/home/me/clojure/extensions/myns/core.clj以及所有依赖文件?以便当再次调用Java调用时,如果这些文件发生变化时能重新加载它们?

1 个答案

0

根据您描述的情景,您需要将/home/me/clojure-extensions/添加到classpath。

要从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格式发布,该目录应由管理员提供。
我已经看到这个问题了。但我需要加载同一个路径下的文件及所有依赖文件。看起来,我不得不在JVM进程已经运行时扩展Java类路径,然后使用Clojure API。
你不能更改类路径,但你可以创建一个新的类加载器上下文在你的应用程序中运行,该上下文包括额外的目录(参见图URLClassLoader)。这样做将需要在Java API中通过Clojure类首次实例化Clojure运行时,并且需要从Clojure API返回的对象类(因为应用程序上下文需要访问你返回的任何类)。特别是,如果你期望的不仅仅是内置的Java接口(集合、列表、映射、字符串等),我建议创建Java接口并返回这些接口的实现实例。
...