Eclipse plugin 如何在RCP应用程序中嵌入Clojure

Eclipse plugin 如何在RCP应用程序中嵌入Clojure,eclipse-plugin,clojure,eclipse-rcp,Eclipse Plugin,Clojure,Eclipse Rcp,我目前正在使用javascript向EclipseRCP应用程序添加脚本,但我更希望能够使用Clojure。然而,我遇到了类路径困难,因为尽管Eclipse可以找到Clojure类,但Clojure本身却找不到 插件激活器的启动方法: public void start(BundleContext context) throws Exception { super.start(context); plugin = this ; Class.forName("clojure

我目前正在使用javascript向EclipseRCP应用程序添加脚本,但我更希望能够使用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\uu 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)
java.io.FileNotFoundException:在类路径上找不到clojure/core\uuu init.class或clojure/core.clj:
在clojure.lang.RT.load处(RT.java:402)
在clojure.lang.RT.load处(RT.java:371)
在clojure.lang.RT.doInit(RT.java:406)
在clojure.lang.RT.(RT.java:292)
RCP应用程序基于Eclipse 3.1版


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

您需要将Clojure JAR封装在OSGi包中,以便在Eclipse RCP应用程序中使用它。幸运的是,这是Eclipse插件提供的。

也许您需要在插件的MANIFEST.MF中将必要的路径添加到Bundle类路径中,以便Clojure的JAR可以被类装入器找到。在eclipse中实现这一点的最简单方法是在编辑器中打开plugin.xml并转到“Runtime”选项卡

这样,您就不需要使用class.forName(“clojure.lang.RT”);-我在这里觉得这与我无关


我通过向逆时针方向的插件(ccw.Clojure和ccw.clojurecontrib)添加依赖项,使我的插件与Clojure一起工作。

这比我想象的要简单得多:我假设在激活捆绑包/插件时,线程的类加载器将是加载插件的类加载器。不是,是应用程序类加载器

因此,解决方案很简单:

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() ;

clojure.jar是否位于您正在运行的应用程序的类路径中?Class.forName是ccw.clojure插件的功能。错误是从那里来的,不管是不是无关,至少很有趣:)好的。现在我认为这可能需要通过一些类加载器强制Clojure编译——只是猜测而已;我只需要调整依赖项(以避免访问应用程序类时出现问题),然后将其放入。逆时针方向并没有完全做到这一点。