(我知道這是關係到How can I embed Clojure in an RCP application,但該線程是舊的,我的設置是有所不同)Clojure的類路徑問題
我使用Eclipse 3.7.1和天現在有一直試圖在Clojure中編寫Eclipse/RCP應用程序(儘可能)。我嘗試過構建clojure.osgi和CCW的源代碼版本,嘗試了RCPClojure演示項目和其他一些東西。他們每個人都沒有工作(主要看似「不可修復」的構建/類路徑錯誤,缺乏最新的文檔/響應,版本衝突等...)
我自己的步驟使我至少有50%的成功:
創建一個新的插件項目包裝Clojure的1.3.0 jar文件,設置插件ID
org.clojure.v1.3.0
使用RCP你好模板創建一個新的插件項目
org.cljtest42
- 添加
org.clojure
插件依賴性 - 添加CCW項目性質(啓用AOT編譯),這個步驟將
/classes
文件夾 - 編輯
plugin.xml
添加/classes
文件夾運行時類路徑,還可以添加到org.cljtest42
導出包。通過選擇(ns org.cljtest42.TestClass (:gen-class)) (defn -main [greet] (println greet))
compile.clj
(ns org.cljtest42.compile) (dorun (map compile ['org.cljtest42.TestClass]))
觸發AOT編譯:
- 添加
在
org.cljtest42
包/名稱空間中添加兩個簡單的Clojure文件:TestClass.clj項目節點並選擇Run> Clojure應用程序(
/classes
文件夾現在應該被編譯clojure類填充)。參考TestClass中從
Activator
類(例如,在啓動() - 也嘗試在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編譯的類實際上並沒有在類路徑中結束(不知道爲什麼?,/明確添加了類),或者由於Equinox/OSGI的方式,單獨的Clojure插件無法訪問它們作品?
謝謝!
This Works。這裏有一些額外的說明。 1)在您的Clojure運行時插件中,您必須導出jar中的所有包。 2)您應該在運行時插件中使用'Eclipse-BuddyPolicy:registered',然後在相關插件中使用相應的'Eclipse-RegisterBudy'條目。 3)如果你的依賴插件被其他插件調用,而這些插件不直接依賴於你的Clojure運行時插件,那麼你的依賴插件必須重新導出Clojure運行時依賴。 – Bill
這可能是一個很好的解決方法,但正確的方法是讓Clojure AOT實際將必要的導入注入到捆綁包中,因此您不必在OSGi規範中使用Eclipse夥伴。但這需要Clojure AOT做正確的事情。 –
這假設您願意AOT您的clojure代碼。 – Bill