2011-11-05 8 views
5

(I이이 How can I embed Clojure in an RCP application 관련이 알고 있어요,하지만 스레드가 오래되어 내 설정이 약간 다릅니다) 내가 이클립스 3.7.1를 사용하고 있습니다Clojure의 클래스 경로 문제

및 일 지금이 가능하면 Clojure에서 Eclipse/RCP 응용 프로그램을 작성하려고했습니다. 나는 clojure.osgiCCW의 소스 버전을 빌드하고, RCPClojure 데모 프로젝트와 다른 여러 가지 작업을 시도했습니다. 그들 각각은 작업을하지 못했습니다 (주로 "수정 불가능한"빌드/클래스 경로 오류, 최신 문서/응답 부족, 버전 충돌 등 ...)

내 단계로 50 % 이상 성공 :

  1. 는 RCP 안녕하세요 템플릿을 사용하여 새 플러그인 프로젝트 org.cljtest42 만들기 Clojure의 1.3.0 jar 파일을 포장 새로운 플러그인 프로젝트 설정 플러그인 ID org.clojure.v1.3.0

  2. 만들기

    1. 추가 org.clojure 플러그인 종속성
    2. 는 CCW 프로젝트 특성을 (AOT의 컴파일을 가능하게하기 위해) 추가,이 단계는 또한, 클래스 경로를 런타임에 /classes 폴더를 추가 수출 패키지에 org.cljtest42를 추가 할 수 /classes 폴더
    3. 편집 plugin.xml을 추가합니다.
  3. 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])) 
    
  4. 트리거 AOT 컴파일을 선택하여 Run> Clojure application ()을 선택한다.폴더는 컴파일 된 클래스로 채워 져야합니다).

  5. 참조의 TestClass는 Activator 클래스에서 (예를 들어 처음에() - 또한 Perspective.createInitialLayout에서 재판을())

지금까지 너무 좋아. 그러나이 프로젝트를 실행하려고하는 것은 Eclipse 애플리케이션은 항상이 실패로 자세한 지식이있는 사람이이 문제를 극복 할 수있는 방법에 대한 몇 가지 포인터를 공유 할 수 있다면

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 번들은 내 보낸 번들의 클래스를 볼 수없는 것 같습니다. 왜냐하면 OSGi (아마 아시다시피)에서 번들이 클래스를 볼 수 있으려면 해당 패키지를 가져와야하기 때문입니다.

하지만 번들이 호출 한 번들에서 클래스를로드해야하는 경우는 어떻습니까? 이 작업을하기 위해서는, Eclipse는 바로이 경우를 위해 설계 buddy policies을 구현했습니다

  1. 귀하의 Clojure의 번들 매니페스트 헤더 Eclipse-BuddyPolicy: [dependent|registered]을 가질 필요가있다. 내가 Clojure의 어떤 경험이없는,하지만 난 가져 가고 싶어 : Eclipse-RegisterBuddy: <clojure-bundle-name>

면책 조항 :이 Eclipse-BuddyPolicy: registered을 추가 한 경우

  • , 당신은 Clojure를 사용하는 번들에 매니페스트 헤더를 추가해야합니다 이걸 쐈어.

  • +0

    이것은 작동합니다. 다음은 몇 가지 추가 정보입니다. 1) Clojure 런타임 플러그인에서 jar에있는 모든 패키지를 익스포트해야합니다. 2) 런타임 플러그인에서'Eclipse-BuddyPolicy : registered'를 사용하고 종속 플러그인에서 해당 Eclipse-RegisterBudy 항목을 사용해야합니다. 3) 종속 플러그인이 Clojure 런타임 플러그인에 직접 의존하지 않는 다른 플러그인에 의해 호출 된 경우 종속 플러그인은 Clojure 런타임 종속성을 다시 익스포트해야합니다. – Bill

    +0

    이것은 아마도 좋은 해결 방법 일 것입니다 만, Clojure AOT가 실제로 필요한 번들을 번들에 주입하기 때문에 OSGi 사양을 따라갈 때 Eclipse 버디를 사용할 필요가 없습니다. 그러나 이것은 Clojure AOT가 올바른 일을 할 것을 요구할 것입니다. –

    +0

    그건 당신이 당신의 클로저 코드를 기꺼이 받아들이는 것을 전제로합니다. – Bill