2010-02-28 51 views
4

我目前使用JavaScript將腳本添加到Eclipse RCP應用程序,但我更願意能夠使用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應用程序是基於Eclipse 3.1版本

有誰知道如何解決這一問題?

+0

是CLASSPATH應用clojure.jar,那你運行? – 2010-03-01 08:53:36

回答

2

您需要將Clojure JAR包裝在OSGi包中以在Eclipse RCP應用程序中使用它。幸運的是,這個has already been doneCounterclockwise Eclipse插件。

+1

種類,但我想要一個插件,啓動時啓動一個swank服務器;我只是調整依賴關係(以避免訪問應用程序類的問題),並將其放入。 逆時針方向並不完全符合要求。 – TomSW 2010-03-02 14:45:03

1

也許你需要在插件的MANIFEST.MF中爲你的Bundle-ClassPath添加必要的路徑,所以Clojure的jar可以通過類加載器找到。在eclipse中最簡單的方法是在編輯器中打開plugin.xml並轉到「運行時」選項卡。你不需要用Class.forName(「clojure.lang.RT」)強制類加載; - 這裏看起來與我無關。

我通過向Counterclockwise插件添加依賴項(ccw.clojure和ccw.clojurecontrib),使我的插件與Clojure一起工作。

+0

Class.forName是ccw.clojure插件的功能。而錯誤是從那裏來的,無關或不是至少有趣:) – TomSW 2010-03-02 14:41:29

+0

好的。現在我認爲這可能需要通過一些類加載器強制Clojure編譯 - 只是猜測。 – 2010-03-07 17:14:05

3

它比我想象的要簡單得多:我曾經假設當激活bundle/plugin時,線程的類加載器將是加載插件的類。不是,它是應用程序類加載器。

因此,解決辦法很簡單:

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() ; 
相關問題