Как я могу динамически загрузить скрипт Clojure из-за пределов моего classpath из Java? - PullRequest
5 голосов
/ 30 июля 2010

Я хочу, чтобы пользовательские сценарии Clojure взаимодействовали с моим Java-приложением.Проблема в том, что я заранее не знаю, где будут находиться скрипты Clojure, поэтому я не могу включить их в мой путь к классу при запуске приложения.

Как динамически загружать скрипт Clojure извнемоего classpath?

Я попробовал простой пример:

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) Я мог бы, вероятно, перепутать Javadoc для clojure.lang.RT, но я просто не мог их найти.

Ответы [ 2 ]

6 голосов
/ 30 июля 2010

Попробуйте clojure.lang.Compiler.loadFile(String file)

1 голос
/ 30 июля 2010

Пока они зависят от содержимого вашего пути к классам, вы можете прочитать файл как строку и оценить его,

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

read-string читает один объект из потока, поэтому вам нужно обернуть все в списке, чтобы сделать его одним объектом.

...