如何在clojure中开发Eclipse插件?

时间:2011-11-23 10:35:16

标签: eclipse clojure eclipse-pde eclipse-plugin

我想知道是否有办法在Clojure中开发Eclipse插件。要清楚,问题不在于使用Eclipse编写Clojure代码。

Eclipse和Clojure都在JVM上运行,我觉得应该有办法利用Clojure(及其库)的强大功能来开发插件。我特意看着使用Korma,但总的来说,如果有一种自然的方式,我想将完整的插件移到clojure上。

3 个答案:

答案 0 :(得分:10)

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

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

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

但请记住,最后,从bundle1& bundle2将由bundle myapp.clojure中的“全局命名空间世界”持有。

说实话,这还没有证明逆时针的问题。因为在同一个功能中,让捆绑包共享一个Clojure实例几乎没问题。

潜在的缺点是:

  • 如果您使用第三方库,例如tools.logging,你将无法在myapp.bundle1中拥有名称空间依赖于tools.logging的版本X,同时myapp.bundle2依赖于tools.logging的版本Y.也就是说,在您通过bundle myapp.clojure进行共享clojure的功能中,您就像OSGi规则不适用一样,例如,webapps正常工作。
  • 如果大量应用,
  • 不能很好地扩展:如果每个Eclipse Feature都要重新打包它自己的Clojure版本,那么会有一些内存浪费。但这个缺点更具理论性而非实际性。这是一个问题,可以在以后出现问题时出现。

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

如果你想看看Counterclockwise如何重新打包clojure,并使用clojure.osgi,你可以查看它的源代码:

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

HTH,

- 劳伦特

答案 1 :(得分:4)

它似乎在Eclipse 3.x中不可用,但计划用于Eclipse 4,如http://wiki.eclipse.org/E4/Languages中所述。

还有a post here on Stack Overflow asking about development of Eclipse plugins in languages other than Java可能有更多您觉得有用的信息。

答案 2 :(得分:3)

完全可以在GroovyScala中编写Eclipse插件。由于Clojure生成.class文件,它应该没有什么不同。但是,插件通常使用PDE Build导出,PDE Build默认只处理Java,所以你必须编写一个customCallback.xml文件来编译Clojure(参见http://www.michel-kraemer.com/scala-projects-with-eclipse-pde-build-2 for Scala build)。