【问题标题】:How do I dynamically load a Clojure script from outside of my classpath from java?如何从 java 的类路径外部动态加载 Clojure 脚本?
【发布时间】:2010-07-30 13:49:55
【问题描述】:

我希望启用用户定义的 Clojure 脚本来与我的 Java 应用程序交互。问题是,我事先不知道 Clojure 脚本的位置,所以我无法在运行应用程序时将它们包含在我的类路径中。

如何从我的类路径外部动态加载 Clojure 脚本?

我已经尝试了这个简单的例子:

RT.loadResourceScript("test.clj");
Var foo = RT.var("user", "foo");
Object result = foo.invoke("Hi", "there");
System.out.println(result);

带有如下所示的 test.clj:

(ns user)

(defn foo [a b]
    (str a " " b))

但没有运气。

我认为这与RT.makeClassLoader()RT.baseLoader() 以及使用返回的加载程序加载clojure 文件有关,但我似乎无法使其工作。 (我不断收到ClassNotFound)我可能会混淆clojure.lang.RT 的javadoc,但我根本找不到它们。

【问题讨论】:

  • 是的... javadoc 呢! #:/

标签: java clojure classpath embedded-language


【解决方案1】:

试试clojure.lang.Compiler.loadFile(String file)

【讨论】:

  • 将其添加到 clojure wiki 是否合适?
【解决方案2】:

只要它们依赖于类路径中的内容,您可以将文件作为字符串读取并对其进行评估,

(def content "(ns user) (defn foo [a b] (str a \" \" b))")
(map eval (read-string (str \( content \))))

read-string 从流中读取一个对象,因此您需要将所有内容包装在一个列表中以使其成为一个对象。

【讨论】:

  • 感谢 Hamza,但我是从 Java 调用它的。我希望能够进行评估。但是没有文档,我根本不知道eval 方法在哪里。 (它不在 clojure.lang.RT - 我检查过)
  • [编辑:] 等等,我想我明白了。您的意思是在已知位置编写一个 clojure 文件,并将我想要解释为 arg 的 clojure 文件的内容传递给它,以便它返回我想要的内容。没有更简单的方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 2018-12-19
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2019-07-29
  • 2014-02-03
相关资源
最近更新 更多