2011-11-23 88 views
8

我想知道是否有方法在Clojure中开发Eclipse插件。要明确,问题不在于使用Eclipse编写Clojure代码。如何在clojure中开发Eclipse插件?

Eclipse和Clojure都运行在JVM上,我觉得应该有办法利用Clojure(及其库)开发插件的能力。我特别关注使用Korma,但总体而言,如果有一种自然的方式来完成,我希望将完整的插件移至clojure。

+0

思考了一下后,我进行了一次小型头脑风暴,并搜索了OSGI和Clojure,并发现了这篇关于[在OSGI下运行clojure]的博客文章(http://www.talios.com/clojure_running_succ essfully_under_osgi.htm)和[email thread](http://osdir.com/ml/clojure/2009-10/msg00113.html)暗示它不是一个好主意。有点困惑。 – Punit

回答

10

逆时针方向,Clojure的Eclipse插件是用混合Java和Clojure编写的。它使用clojure.osgi 1.2.10呢。

所以这是一个活的证明概念,它是可能的。而AFAIK,逆时针成功地被数百人使用。

有一些约束,tho:Clojure的名称空间对某些“根类加载器”是“全局”的。例如。如果将Clojure包装在一个名为myapp.clojure的包中,那么您可能会有一堆其他包需要myapp.clojure。例如说myapp.bundle1,myapp.bundle2。当你这样做时,并且从每个bundle中加载内存(需要)bundle命名空间,每一个都将从正确的ClassLoader中加载(myapp.bundle1的命名空间将被加载到myapp.bundle1的上下文classloader中,并且myapp.bundle2的名称空间将在myapp.bundle2的上下文类加载器中加载)。这很好,因为它允许java interop工作正常。

但是请记住,最终,从bundle1 & bundle2加载的名称空间将由myapp.clojure包中的“全局命名空间世界”保存。

说实话,这对于逆时针还没有证明是个问题。因为在同一个特性中,让包共享一个Clojure实例几乎没问题。

潜在的缺点是:

  • 如果使用第三方库,例如tools.logging中,myapp.bundle1中的名称空间将无法依赖于tools.logging的版本X,同时myapp.bundle2依赖于tools.logging的版本Y.也就是说,在您的功能中,通过捆绑包myapp.clojure共享clojure,就像OSGi规则不适用一样,例如Web应用程序可以工作。
  • 如果大量应用,效果不好:如果每个Eclipse功能要重新打包自己的Clojure版本,则会浪费内存。但是这个缺点比理论上更理论化。这是一个可以在以后出现的问题,当它出现的时候。

请注意,对于Eclipse RCP产品,与Eclipse插件相反,这些缺陷消失。

如果你想看到逆时针是如何重新包装的Clojure,并使用clojure.osgi,你可以看看它的源代码:

http://github.com/laurentpetit/ccw.clojure.git http://github.com/laurentpetit/ccw.git

HTH,

- 洛朗