(我知道这与How can I embed Clojure in an RCP application有关,但该线程已经过时,我的设置有所不同)
我正在使用Eclipse 3.7.1,现在已经尝试在Clojure中编写Eclipse / RCP应用程序(尽可能多)。我尝试构建clojure.osgi和CCW的源版本,尝试了RCPClojure演示项目以及其他一些内容。他们中的每一个都没有工作(主要看似“不可修复”的构建/类路径错误,缺乏最新的文档/响应,版本冲突等......)
我自己的步骤为我带来至少50%的成功:
创建一个包含Clojure 1.3.0 jar文件的新插件项目,设置插件ID org.clojure.v1.3.0
使用RCP Hello模板
创建一个新的插件项目org.cljtest42
org.clojure
插件依赖/classes
文件夹plugin.xml
以将/classes
文件夹添加到运行时类路径,同时将org.cljtest42
添加到导出的包中。在org.cljtest42
包/命名空间中添加两个简单的Clojure文件:
TestClass.clj:
(ns org.cljtest42.TestClass
(:gen-class))
(defn -main [greet] (println greet))
compile.clj
(ns org.cljtest42.compile)
(dorun (map compile ['org.cljtest42.TestClass]))
通过选择项目节点并选择Run>触发AOT编译。 Clojure应用程序(/classes
文件夹现在应该用编译的clojure类填充。)
来自Activator
类的参考TestClass(例如在start()中 - 也在Perspective.createInitialLayout()中尝试过)
到目前为止一切顺利。但是,尝试将此项目作为Eclipse应用程序运行时总会失败:
java.io.FileNotFoundException: Could not locate org/cljtest42/TestClass__init.class or org/cljtest42/TestClass.clj on classpath:
at clojure.lang.RT.load(RT.java:430)
at clojure.lang.RT.load(RT.java:398)
at clojure.core$load$fn__4610.invoke(core.clj:5386)
at clojure.core$load.doInvoke(core.clj:5385)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.lang.Var.invoke(Var.java:401)
at com.pspctclr.cljtest42.TestClass.<clinit>(Unknown Source)
如果有更多知识渊博的人可以就如何克服这个问题分享一些指示,那就太棒了。可能是因为AOT编译的类实际上并没有在类路径中结束(不确定为什么?,/ class被明确添加),或者由于Equinox / OSGI的方式,单独的Clojure插件无法访问它们作品?
谢谢!
答案 0 :(得分:1)
问题似乎是Clojure捆绑包没有看到你的捆绑类,尽管你已经导出了它们。这是因为,在OSGi中(您可能知道),为了使bundle能够看到一个类,需要导入它的包。
但是,捆绑包需要从捆绑中加载一个类的情况呢?为了实现这一点,Eclipse实现了buddy policies,它完全针对这种情况设计:
Eclipse-BuddyPolicy: [dependent|registered]
。Eclipse-BuddyPolicy: registered
,则需要向捆绑包添加清单标头,该标头使用Clojure:Eclipse-RegisterBuddy: <clojure-bundle-name>
免责声明:我对Clojure没有任何经验,但我想对此有所了解。