如何在CCP应用程序中嵌入Clojure

时间:2010-02-28 19:06:17

标签: eclipse-plugin clojure eclipse-rcp

我目前正在使用javascript将脚本添加到Eclipse RCP应用程序中,但我更愿意能够使用Clojure。但是,我遇到了类路径困难,因为虽然Eclipse可以找到Clojure类,但Clojure本身不能。

插件激活器的启动方法:

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版

有谁知道如何解决这个问题?

3 个答案:

答案 0 :(得分: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() ;

答案 1 :(得分:2)

您需要将Clojure JAR包装在OSGi包中,以便在Eclipse RCP应用程序中使用它。幸运的是,has already been done Eclipse插件的这个Counterclockwise

答案 2 :(得分:1)

也许您需要在插件的MANIFEST.MF中为Bundle-ClassPath添加必要的路径,以便Clojure的jar可以通过类加载器找到。在eclipse中最简单的方法是在编辑器中打开plugin.xml并转到“运行时”选项卡。

AFAIK您不需要使用Class.forName(“clojure.lang.RT”)强制加载类; - 这在我看来与我无关。

我通过向Counterclockwise插件添加依赖项(ccw.clojure和ccw.clojurecontrib)使我的插件与Clojure一起工作。