Clojure 的 Eclipse 插件逆时针是用 Java 和 Clojure 混合编写的。它还使用 clojure.osgi 1.2.10。
因此,这是可能的概念的现场证明。 AFAIK,逆时针已被数百人成功使用。
虽然有一些限制:Clojure 的命名空间对于某些“根类加载器”来说是“全局的”。例如。如果你将 Clojure 打包到一个名为 myapp.clojure 的包中,那么你可能会有一堆其他需要 myapp.clojure 的包。比如说 myapp.bundle1、myapp.bundle2。当您这样做时,并且从每个捆绑包加载到内存中(需要)捆绑包命名空间,每个都将从正确的 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 功能都重新打包自己的 Clojure 版本,则会浪费一些内存。但这个缺点更多的是理论上的,而不是实际的。这是一个可以在以后需要时解决的问题。
请注意,对于 Eclipse RCP 产品,与 Eclipse 插件相比,这些缺点消失了。
如果你想看看逆时针如何重新打包clojure,并使用clojure.osgi,你可以看看它的源码:
http://github.com/laurentpetit/ccw.clojure.git
http://github.com/laurentpetit/ccw.git
HTH,
--洛朗