Eclipse插件中的Clojure类路径问题

tox*_*oxi 5 eclipse osgi clojure classpath eclipse-rcp

(我知道这与我如何在CCP应用程序中嵌入Clojure相关,但该线程已经过时,我的设置有所不同)

我正在使用Eclipse 3.7.1,现在已经尝试在Clojure中编写Eclipse/RCP应用程序(尽可能多).我已经尝试构建clojure.osgiCCW的源代码版本,尝试了RCPClojure演示项目和其他一些东西.他们每个人都没有工作(主要看似"不可修复"的构建/类路径错误,缺乏最新的文档/响应,版本冲突等...)

我自己的步骤为我带来至少50%的成功:

  1. 创建一个包含Clojure 1.3.0 jar文件的新插件项目,设置插件ID org.clojure.v1.3.0

  2. org.cljtest42使用RCP Hello模板创建一个新的插件项目

    1. 添加org.clojure插件依赖项
    2. 添加CCW项目性质(启用AOT编译),此步骤添加/classes文件夹
    3. 编辑plugin.xml以将/classes文件夹添加到运行时类路径,也添加org.cljtest42到导出的包.
  3. org.cljtest42包/命名空间中添加两个简单的Clojure文件:

    TestClass.clj:

    (ns org.cljtest42.TestClass
    (:gen-class))
    
    (defn -main [greet] (println greet))
    
    Run Code Online (Sandbox Code Playgroud)

    compile.clj

    (ns org.cljtest42.compile)
    (dorun (map compile ['org.cljtest42.TestClass]))
    
    Run Code Online (Sandbox Code Playgroud)
  4. 通过选择项目节点触发AOT编译,然后选择Run> Clojure application(该/classes文件夹现在应填充已编译的clojure类).

  5. Activator类中引用TestClass (例如在start()中 - 也在Perspective.createInitialLayout()中尝试过)

到现在为止还挺好.但是,尝试将此项目作为Eclipse应用程序运行始终会失败:

java.io.FileNotFoundException: Could not locate org/cljtest42/TestClass__init.class or org/cljtest42/TestClass.clj on classpath:
at clojure.lang.RT.load(RT.java:430)
at clojure.lang.RT.load(RT.java:398)
at clojure.core$load$fn__4610.invoke(core.clj:5386)
at clojure.core$load.doInvoke(core.clj:5385)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.lang.Var.invoke(Var.java:401)
at com.pspctclr.cljtest42.TestClass.<clinit>(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

如果有更多知识渊博的人可以就如何克服这个问题分享一些指示,那将是非常出色的.可能是因为AOT编译的类实际上并没有在类路径中结束(不确定为什么?,/ class被明确添加),或者由于Equinox/OSGI的方式,单独的Clojure插件无法访问它们作品?

谢谢!

Dan*_*hev 1

问题似乎是 Clojure 包看不到您的包的类,尽管您已经导出了它们。这是因为,在 OSGi 中(您可能知道),为了使包能够看到类,需要导入其包。

但是,如果包需要从已调用它的包中加载类,那么情况又如何呢?为了实现这一点,Eclipse 实现了伙伴策略,它是专门针对这种情况设计的:

  1. 您的 Clojure 包需要有清单 header Eclipse-BuddyPolicy: [dependent|registered]
  2. 如果您已添加Eclipse-BuddyPolicy: registered,则需要将清单标头添加到捆绑包中,该标头使用 Clojure:Eclipse-RegisterBuddy: <clojure-bundle-name>

免责声明:我没有任何使用 Clojure 的经验,但我想尝试一下。