(I이이 How can I embed Clojure in an RCP application 관련이 알고 있어요,하지만 스레드가 오래되어 내 설정이 약간 다릅니다) 내가 이클립스 3.7.1를 사용하고 있습니다Clojure의 클래스 경로 문제
및 일 지금이 가능하면 Clojure에서 Eclipse/RCP 응용 프로그램을 작성하려고했습니다. 나는 clojure.osgi과 CCW의 소스 버전을 빌드하고, RCPClojure 데모 프로젝트와 다른 여러 가지 작업을 시도했습니다. 그들 각각은 작업을하지 못했습니다 (주로 "수정 불가능한"빌드/클래스 경로 오류, 최신 문서/응답 부족, 버전 충돌 등 ...)
내 단계로 50 % 이상 성공 :
는 RCP 안녕하세요 템플릿을 사용하여 새 플러그인 프로젝트
org.cljtest42
만들기 Clojure의 1.3.0 jar 파일을 포장 새로운 플러그인 프로젝트 설정 플러그인 IDorg.clojure.v1.3.0
만들기
- 추가
org.clojure
플러그인 종속성 - 는 CCW 프로젝트 특성을 (AOT의 컴파일을 가능하게하기 위해) 추가,이 단계는 또한, 클래스 경로를 런타임에
/classes
폴더를 추가 수출 패키지에org.cljtest42
를 추가 할 수/classes
폴더 - 편집
plugin.xml
을 추가합니다.
- 추가
org.cljtest42
패키지/네임 스페이스에 두 가지 간단한 Clojure의 파일을 추가합니다TestClass.clj을 :
(ns org.cljtest42.TestClass (:gen-class)) (defn -main [greet] (println greet))
compile.clj
(ns org.cljtest42.compile) (dorun (map compile ['org.cljtest42.TestClass]))
트리거 AOT 컴파일을 선택하여 Run> Clojure application ()을 선택한다.폴더는 컴파일 된 클래스로 채워 져야합니다).
참조의 TestClass는
Activator
클래스에서 (예를 들어 처음에() - 또한 Perspective.createInitialLayout에서 재판을())
java.io.FileNotFoundException: Could not locate org/cljtest42/TestClass__init.class or org/cljtest42/TestClass.clj on classpath:
at clojure.lang.RT.load(RT.java:430)
at clojure.lang.RT.load(RT.java:398)
at clojure.core$load$fn__4610.invoke(core.clj:5386)
at clojure.core$load.doInvoke(core.clj:5385)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.lang.Var.invoke(Var.java:401)
at com.pspctclr.cljtest42.TestClass.<clinit>(Unknown Source)
이 뛰어난 것입니다. AOT 컴파일 된 클래스가 실제로 classpath에서 끝나지 않아서 (왜?,/classes가 명시 적으로 추가되었는지) 아니면 별도의 Clojure 플러그인이 Equinox/OSGI 방식으로 인해 액세스 할 수 없기 때문일 수 있습니까? 공장?
감사합니다.
이것은 작동합니다. 다음은 몇 가지 추가 정보입니다. 1) Clojure 런타임 플러그인에서 jar에있는 모든 패키지를 익스포트해야합니다. 2) 런타임 플러그인에서'Eclipse-BuddyPolicy : registered'를 사용하고 종속 플러그인에서 해당 Eclipse-RegisterBudy 항목을 사용해야합니다. 3) 종속 플러그인이 Clojure 런타임 플러그인에 직접 의존하지 않는 다른 플러그인에 의해 호출 된 경우 종속 플러그인은 Clojure 런타임 종속성을 다시 익스포트해야합니다. – Bill
이것은 아마도 좋은 해결 방법 일 것입니다 만, Clojure AOT가 실제로 필요한 번들을 번들에 주입하기 때문에 OSGi 사양을 따라갈 때 Eclipse 버디를 사용할 필요가 없습니다. 그러나 이것은 Clojure AOT가 올바른 일을 할 것을 요구할 것입니다. –
그건 당신이 당신의 클로저 코드를 기꺼이 받아들이는 것을 전제로합니다. – Bill