2010-02-28 61 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() ; 
相关问题