Eclipse插件中的Clojure类路径问题

时间:2011-11-05 04:32:56

标签: eclipse clojure classpath eclipse-rcp osgi

(我知道这与How can I embed Clojure in an RCP application有关,但该线程已经过时,我的设置有所不同)

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

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

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

  2. 使用RCP Hello模板

    创建一个新的插件项目org.cljtest42
    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))
    

    compile.clj

    (ns org.cljtest42.compile)
    (dorun (map compile ['org.cljtest42.TestClass]))
    
  4. 通过选择项目节点并选择Run>触发AOT编译。 Clojure应用程序(/classes文件夹现在应该用编译的clojure类填充。)

  5. 来自Activator类的参考TestClass(例如在start()中 - 也在Perspective.createInitialLayout()中尝试过)

  6. 到目前为止一切顺利。但是,尝试将此项目作为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)
    

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

    谢谢!

1 个答案:

答案 0 :(得分:1)

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

但是,捆绑包需要从捆绑中加载一个类的情况呢?为了实现这一点,Eclipse实现了buddy policies,它完全针对这种情况设计:

  1. 您的Clojure捆绑包需要具有清单标头Eclipse-BuddyPolicy: [dependent|registered]
  2. 如果您已添加Eclipse-BuddyPolicy: registered,则需要向捆绑包添加清单标头,该标头使用Clojure:Eclipse-RegisterBuddy: <clojure-bundle-name>
  3. 免责声明:我对Clojure没有任何经验,但我想对此有所了解。