Eclipse plugin 如何在RCP应用程序中嵌入Clojure
我目前正在使用javascript向EclipseRCP应用程序添加脚本,但我更希望能够使用Clojure。然而,我遇到了类路径困难,因为尽管Eclipse可以找到Clojure类,但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
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编译——只是猜测而已;我只需要调整依赖项(以避免访问应用程序类时出现问题),然后将其放入。逆时针方向并没有完全做到这一点。