eclipse - 如何在 clojure 中开发 Eclipse 插件?

标签 eclipse clojure eclipse-pde eclipse-plugin

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

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

最佳答案

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

因此,这是可能的概念的现场证明。 AFAIK,逆时针已被数百人成功使用。

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

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

老实说,这还没有证明逆时针有问题。因为在同一个 Feature 中,让 bundle 共享一个 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 插件相反,这些缺点会消失。

    如果你想看看Counterclock是如何重新打包clojure,并使用clojure.osgi的,可以看一下它的源码:

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

    哈,

    ——洛朗

    关于eclipse - 如何在 clojure 中开发 Eclipse 插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8240703/

    相关文章:

    java - 无法解析类型 java.util.Map$Entry。它是从所需的 .class 文件中间接引用的

    java - 如何在 Eclipse 中按文本顺序查看方法,以便在编辑器中导航?

    clojure - 我的简单 Clojure gen-class 脚本有什么问题?

    java - Clojure - 找不到匹配的方法

    eclipse - 如何在Eclipse RCP目标平台中将源代码位置附加到插件?

    java - "The application could not start"运行插件时会产生堆栈跟踪,但不会产生调试 session

    java - STS : Imported projects are showing compilation error with triangle symbol

    html - Eclipse - 如何扩展 HTML 编辑器以添加自定义标签?

    Clojure rseq 恒定时间?

    eclipse - 在 Eclipse Package Explorer 中处理文件的拖放