2010-07-30 2 views
5

사용자 정의 Clojure 스크립트가 Java App과 상호 작용할 수있게하고 싶습니다. 문제는 Clojure 스크립트가 어디에 배치 될지 미리 알지 못하기 때문에 앱을 실행할 때 클래스 패스에 포함시킬 수 없다는 것입니다.Java에서 클래스 경로 외부에서 Clojure 스크립트를 동적으로로드하는 방법은 무엇입니까?

클래스 경로 외부에서 Clojure 스크립트를 어떻게 동적으로로드합니까?

(ns user) 

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

하지만 행운 :처럼 보이는 test.clj와

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

:

나는 간단한 예를 시도했습니다.

나는 RT.makeClassLoader() 또는 RT.baseLoader()과 관련이 있으며 반환 된 로더를 사용하여 clojure 파일을로드한다고 생각하지만 제대로 작동하지 않는 것 같습니다. (나는 계속 ClassNotFound을 얻고있다.) 아마도 나는 clojure.lang.RT을위한 javadoc을 혼란스럽게 할 수 있었지만, 나는 그것을 찾을 수 없었다.

+0

예 ... 어디에 있습니까? # :/ – progo

답변

6

시도해보십시오. clojure.lang.Compiler.loadFile(String file)

+0

그게 전부 야. 스튜어트에게 감사드립니다! – brice

+0

Clojure wiki에 이것을 추가하는 것이 적절할까요? – brice

1

는 그들이 문자열로 파일을 읽고 그것을 평가되어 당신이 할 수있는 클래스 경로에있는 물건에 의존로

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

읽기 문자열 스트림에서 하나 개의 객체를 읽어 을 수행해야하므로 목록에있는 모든 것을 랩핑하여 하나의 객체로 만듭니다.

+0

감사합니다 Hamza,하지만 ** Java **에서 호출하고 있습니다. 나는 평가를 할 수 있기를 바란다. 그러나 문서가 없다면'eval' 메서드가 어디에 있는지 간단히 알 수 없습니다. (그 clojure.lang.RT에 - 나는 체크했다) – brice

+0

[편집 :] 잠깐, 내가 당신을 얻을 것 같아요. 알려진 위치에 clojure 파일을 작성하고, arg로 해석 할 clojure 파일의 내용을 전달하여 원하는대로 반환합니다. 더 간단한 방법이 없습니까? – brice

관련 문제