如何用Clojure开发Eclipse插件?

8

我想知道是否有一种方法可以使用Clojure开发Eclipse插件。要明确,问题不是关于使用Eclipse编写Clojure代码。

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


经过一番思考,我有了一个小想法,并搜索了关于OSGI和Clojure的相关内容。我发现了这篇关于在OSGI下运行Clojure的博客文章,以及一个电子邮件线程,暗示这不是一个好主意。有点困惑。 - Punit
3个回答

10

逆时针,Clojure的Eclipse插件,使用混合的Java和Clojure编写,目前使用clojure.osgi 1.2.10版本。

因此它是一个活生生的概念证明,说明这是可能的。据我所知,逆时针已经成功地被数百人使用。

然而,存在一些限制:Clojure的命名空间对某些“根类装入器”来说是“全局”的。例如,如果您将Clojure打包到名为myapp.clojure的bundle中,那么您可能会有一堆其他的bundles需要require myapp.clojure,比如myapp.bundle1、myapp.bundle2等。当您从每个bundle中将bundle的命名空间加载到内存中(require),每个命名空间都将从正确的ClassLoader中加载(myapp.bundle1的命名空间将在myapp.bundle1的上下文类加载器中加载,myapp.bundle2的命名空间将在myapp.bundle2的上下文类加载器中加载)。这很棒,因为它允许Java互操作正常工作。

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

老实说,这对于逆时针来说还没有成为问题。因为在同一个Feature中,让bundles共享一个单独的Clojure实例几乎是可以的。

潜在的缺点包括:

  • 如果您使用第三方库,例如tools.logging,那么您将无法让myapp.bundle1的命名空间依赖于tools.logging的X版本,同时让myapp.bundle2依赖于tools.logging的Y版本。也就是说,在您的Feature中,通过bundle myapp.clojure共享Clojure时,您工作的方式就好像OSGi规则不适用,就像web应用程序一样。
  • 如果大规模应用,它的扩展性不太好:如果每个Eclipse Feature都重新打包自己的Clojure版本,会有一些内存浪费。但这个缺点更多是理论上的,而不是实际上的。这是一个可以在需要时解决的问题。
请注意,对于Eclipse RCP产品而言,与Eclipse插件相比,这些缺点会消失。
如果您想看看Counterclockwise如何重新打包clojure,并使用clojure.osgi,可以查看其源代码: http://github.com/laurentpetit/ccw.clojure.git http://github.com/laurentpetit/ccw.git 希望这有所帮助,
--Laurent

4

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接