2010-02-28 7 views
4

현재 Eclipse RCP 응용 프로그램에 스크립팅을 추가하기 위해 javascript를 사용하고 있지만 Clojure를 사용할 수 있기를 원합니다. 그러나 Eclipse가 Clojure 클래스를 찾을 수는 있지만 Clojure 자체는 찾을 수 없으므로 클래스 경로 문제가 발생했습니다. 어떻게 Clojure를 RCP 응용 프로그램에 임베드 할 수 있습니까?

는 플러그인 활성화의 시작 방법 :

public void start(BundleContext context) throws Exception { 
    super.start(context); 
    plugin = this ; 
    Class.forName("clojure.lang.RT") ; 
    JSController.startup() ; 
} 

clojure.lang.RT에 대한 발견 클래스하지 예외를 발생하지 않지만, 같은 장소에 Clojure의/core__init에 대한 .

java.io.FileNotFoundException: Could not locate clojure/core__init.class or clojure/core.clj on classpath: 
     at clojure.lang.RT.load(RT.java:402) 
     at clojure.lang.RT.load(RT.java:371) 
     at clojure.lang.RT.doInit(RT.java:406) 
     at clojure.lang.RT.<clinit>(RT.java:292) 

RCP 응용 프로그램은 3.1

사람이이 문제를 해결하는 방법을 알고 있나요 이클립스 버전을 기반으로?

+0

응용 프로그램에 대한 CLASSPATH에 clojure.jar입니다 :

그래서 해결책은 간단하다? –

답변

2

Eclipse RCP 응용 프로그램에서 사용하려면 OSGi 번들에 Clojure JAR을 래핑해야합니다. 다행히도이 has already been doneCounterclockwise Eclipse 플러그인에 있습니다.

+1

일종의,하지만 시작에 swank 서버를 시작하는 플러그인을 원했습니다; (응용 프로그램의 클래스에 액세스하는 데 문제가 발생하지 않도록) 종속성을 조정하면됩니다. 시계 반대 방향으로는 그렇게하지 않았습니다. – TomSW

1

Clujure의 jar를 클래스 로더가 찾을 수 있도록 플러그인의 MANIFEST.MF에서 Bundle-ClassPath에 필요한 경로를 추가해야 할 수도 있습니다. Eclipse에서 가장 쉬운 방법은 편집기에서 plugin.xml을 열고 "런타임"탭으로 이동하는 것입니다.

AFAIK 클래스를 강제로드 할 필요가 없습니다 .forName ("clojure.lang.RT"); - 내게는 이상하게 보입니다.

반 시계 방향 플러그인 (ccw.clojure 및 ccw.clojurecontrib)에 종속성을 추가하여 Clojure로 플러그인을 만들었습니다.

+0

Class.forName은 ccw.clojure 플러그인이 수행하는 것입니다. 그리고 그 오류는 거기에서 너무 외부이거나 재미 있지는 않습니다. :) – TomSW

+0

Ok. 이제는 이것이 어떤 클래스 로더를 통해 Clojure 컴파일을 강제해야 할 필요가 있다고 생각합니다. –

3

내가 생각했던 것보다 훨씬 간단했다. 나는 번들/플러그인을 활성화 할 때 스레드의 클래스 로더가 플러그인을로드 한 것으로 가정했다. 그것은 아닙니다. 응용 프로그램 클래스 로더입니다. 당신이 실행하는,

Runnable cljRunner = new Runnable(){ 
    public void run(){ 
     Thread thisThread = Thread.currentThread() ; 
     ClassLoader savedCL = thisThread.getContextClassLoader() ;    
     thisThread.setContextClassLoader(Activator.class.getClassLoader()) ; 
     try { 
      clojure.lang.Compiler.load(
       new java.io.StringReader(
         "(require 'clojure.main)\n" + 
         "(require 'swank.swank)\n" + 
         "(clojure.main/with-bindings\n" + 
         " (swank.swank/start-server \"nul\" :encoding \"utf-8\" :port 9999))" 
       )) ; 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     thisThread.setContextClassLoader(savedCL) ; 
    } 
} ; 
cljThread = new Thread(cljRunner) ; 
cljThread.start() ; 
관련 문제