eclipse - 在Eclipse插件中加载Clojure代码

标签 eclipse clojure

我有这种问题。我在* .clj文件的Eclipse插件(表示为A)中包含Clojure代码。我不要AOT编译。但是,我需要从另一个Clojure插件B加载clojure代码。当B依赖于A时,这是可能的。Clojure可以轻松访问类路径,并且一切正常。但是我希望将插件A插入为B的扩展。但是有一个问题,因为我找不到从B的* .clj文件中加载A的Clojure文件的方法。我想使用Clojure的“加载”功能可以从类路径加载* .clj文件,但是该功能无法看到插件的内容当我像这样显式启动插件时,会发生一个事件

 (org.eclipse.core.runtime.Platform/getBundle "A")

对Laurent的回答

洛朗,非常感谢!这很有趣。但是,我认为这可能比我原来的解决一个难题。您描述了如何从java插件中调用clojure代码,这真是太棒了。我需要从clojure插件中调用clojure代码,我认为这可能会更容易。我想我会创建扩展点并提供像这样的clojure函数
<extension point="transforms">
  <function namespace="my.nemaspace" fn="my-transform"/>
</extension>

因此,我不需要IExecutableExtensionFactory的任何魔术。我可以从clojure代码读取扩展注册表。我不能做的是加载扩展中指定的功能。这可行吗,或者我只是误解了什么?我注意到您正在使用clojure.osgi。看起来很酷,该项目是否有任何文档?

最佳答案

我想到了另一个解决方案:尽管在我之前的回答中已经说过,但在Eclipse中,还是有可能在类加载器之间创建循环依赖关系!

Eclipse的家伙需要引入它,以便某些类型的库(log4j等)可以在OSGi环境(Eclipse所基于的环境)中工作。

这需要利用Eclipse-BuddyPolicy机制(Third Party libraries and classloading)。

这很容易:如果您希望插件B查看插件A的所有类和资源,只需将其添加到插件B的META-INF/MANIFEST.MF文件中:

Eclipse-BuddyPolicy: dependent

上面的行指示插件B的类加载器将能够访问其从属类加载器有权访问的内容。

我创建了一个名为A和B的插件示例集,其中B有2个命令(在顶部菜单中可见):第一个通过在B中调用clojure代码在“hello”硬编码字符串上应用文本转换。第二个动态加载一个插件A进行了新的文本转换,因此,当您再次调用第一个命令时,您会看到应用来自B的转换和来自A的转换的结果。

对于您而言,毕竟甚至根本不需要使用Eclipse扩展点/扩展机制。这完全取决于您打算如何使插件B“发现”插件A相关信息。

github仓库展示了这一点:https://github.com/laurentpetit/stackoverflow-12689605

HTH,

-
劳伦特

关于eclipse - 在Eclipse插件中加载Clojure代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12689605/

相关文章:

java - 每次工作后更新 IStatusLineManager 中的 IProgressMonitor()

java - 无法在 Eclipse 中读取文件

Clojure:指定几个约束;强制将 "break out"变成谓词。有什么更好的办法吗?

data-structures - 在 Clojure 中表示一棵树

eclipse - 如何修复 Groovy Grails Tool Suite 3 极端内存使用情况

eclipse - Blackberry Simulator 中出现 JVM ERROR 517 文件系统损坏

java - 如何使用 Object[] 数组调用 MethodHandle.invokeExact()?

clojure - cond 与大子句

clojure - Compojure:陷阱 500 URL 解码错误

clojure - 莱宁根缺少测试资源?