我目前正在使用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版
有谁知道如何解决这个问题?
答案 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一起工作。