2011-11-05 125 views
5

(我知道這是關係到How can I embed Clojure in an RCP application,但該線程是舊的,我的設置是有所不同)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. 使用RCP你好模板創建一個新的插件項目org.cljtest42

    1. 添加org.clojure插件依賴性
    2. 添加CCW項目性質(啓用AOT編譯),這個步驟將/classes文件夾
    3. 編輯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])) 
      
    4. 觸發AOT編譯:

  3. org.cljtest42包/名稱空間中添加兩個簡單的Clojure文件:

    TestClass.clj項目節點並選擇Run> Clojure應用程序(/classes文件夾現在應該被編譯clojure類填充)。

  4. 參考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插件無法訪問它們作品?

謝謝!

回答

1

問題似乎是Clojure包沒有看到你的包的類,雖然你已經導出它們。這是因爲,在OSGi中(正如你可能知道的那樣),爲了讓一個bundle能夠看到一個類,它的包需要被導入。

但是情況怎麼樣,一個bundle需要從一個bundle中加載一個類來調用它。爲了使這項工作,Eclipse已經實現buddy policies,這些正是針對這種情況設計的:

  1. 你Clojure的捆綁需要有清單標題Eclipse-BuddyPolicy: [dependent|registered]
  2. 如果您添加Eclipse-BuddyPolicy: registered,你需要清單頭添加到包,它使用Clojure的:Eclipse-RegisterBuddy: <clojure-bundle-name>

免責聲明:我沒有使用Clojure任何經驗,但我想利用這是一個鏡頭。

+0

This Works。這裏有一些額外的說明。 1)在您的Clojure運行時插件中,您必須導出jar中的所有包。 2)您應該在運行時插件中使用'Eclipse-BuddyPolicy:registered',然後在相關插件中使用相應的'Eclipse-RegisterBudy'條目。 3)如果你的依賴插件被其他插件調用,而這些插件不直接依賴於你的Clojure運行時插件,那麼你的依賴插件必須重新導出Clojure運行時依賴。 – Bill

+0

這可能是一個很好的解決方法,但正確的方法是讓Clojure AOT實際將必要的導入注入到捆綁包中,因此您不必在OSGi規範中使用Eclipse夥伴。但這需要Clojure AOT做正確的事情。 –

+0

這假設您願意AOT您的clojure代碼。 – Bill