2010-07-30 31 views
5

我希望啓用用戶定義的Clojure腳本來與我的Java應用程序進行交互。問題是,我事先並不知道Clojure腳本的位置,所以在運行應用程序時,我不能將它們包含在我的類路徑中。如何從java的classpath之外動態加載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)我可能會混淆通過javadoc的clojure.lang.RT,但我根本找不到它們。

+0

是啊...哪裏有javadoc! #:/ – progo 2011-05-28 16:50:42

回答

6

嘗試clojure.lang.Compiler.loadFile(String file)

+0

就是這樣。謝謝Stuart! – brice 2010-07-30 15:08:02

+0

我可以把它添加到clojure wiki嗎? – brice 2010-07-30 15:12:01

1

只要它們依賴於在類路徑中的東西,你可以做的是閱讀文件作爲一個字符串,並對其進行評估,

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

讀字符串從流中讀取一個對象,所以你需要在列表中包裝everthing使其成爲一個對象。

+0

感謝Hamza,但我從** Java **調用了這個。我希望能夠做一個評估。但沒有文檔,我根本不知道'eval'方法在哪裏。 (它不在clojure.lang.RT - 我檢查) – brice 2010-07-30 14:53:51

+0

[編輯:]等等,我想我得到你。你的意思是在一個已知的位置編寫一個clojure文件,並將它傳遞給我想要解釋爲一個arg的clojure文件的內容,以便它返回我想要的內容。沒有簡單的方法嗎? – brice 2010-07-30 14:58:28