【问题标题】:Clojure classpath issue within an Eclipse pluginEclipse 插件中的 Clojure 类路径问题
【发布时间】:2011-12-22 12:34:24
【问题描述】:

(我知道这与 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))
    

    编译.clj

    (ns org.cljtest42.compile)
    (dorun (map compile ['org.cljtest42.TestClass]))
    
  4. 通过选择项目节点并选择“运行”>“Clojure 应用程序”来触发 AOT 编译(/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)

如果有更博学的人能分享一些关于如何克服这个问题的建议,那就太好了。可能是因为 AOT 编译的类实际上并没有最终出现在类路径中(不知道为什么?, /classes 被显式添加),或者由于 Equinox/OSGI 的方式,单独的 Clojure 插件无法访问它们有效吗?

谢谢!

【问题讨论】:

    标签: eclipse clojure classpath eclipse-rcp osgi


    【解决方案1】:

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

    但是对于一些情况,包需要从包中加载一个类,包中调用了它。为了让它工作,Eclipse 实现了buddy policies,它就是专门为这种情况设计的:

    1. 您的 Clojure 包需要有清单头 Eclipse-BuddyPolicy: [dependent|registered]
    2. 如果您已添加 Eclipse-BuddyPolicy: registered,则需要将清单头添加到使用 Clojure 的包中:Eclipse-RegisterBuddy: &lt;clojure-bundle-name&gt;

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

    【讨论】:

    • 这行得通。这里有一些额外的说明。 1) 在您的 Clojure 运行时插件中,您必须导出 jar 中的所有包。 2) 您可能应该在运行时插件中使用Eclipse-BuddyPolicy: registered,然后在依赖插件中使用相应的Eclipse-RegisterBudy 条目。 3) 如果你的依赖插件被其他不直接依赖于你的 Clojure 运行时插件的插件调用,那么你的依赖插件必须重新导出 Clojure 运行时依赖。
    • 这可能是一个足够好的解决方法,但正确的方法是让 Clojure AOT 将必要的导入实际注入到包中,因此您不必使用 Eclipse 伙伴作为它围绕着 OSGi 规范。但这需要 Clojure AOT 做正确的事情。
    • 前提是你愿意 AOT 你的 clojure 代码。
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    相关资源
    最近更新 更多