2011-11-23 227 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,

- 洛朗