2011-11-05 20 views
5

(私はこれがHow can I embed Clojure in an RCP applicationに関連して認識してんだけど、そのスレッドが古いと私のセットアップが多少異なる場合)私は、Eclipse 3.7.1を使用していClojureのクラスパスの問題

と日のために今持っていますClojureでEclipse/RCPアプリケーションを書くことを試みていました(可能な限り)。私はclojure.osgiCCWのソースバージョンをビルドしようとしましたが、RCPClojureデモプロジェクトといくつかの他のことを試みました。それぞれの人が仕事をしませんでした(主に "修正不可能な"ビルド/クラスパスエラー、最新のドキュメント/レスポンスの欠如、バージョンの競合など...)

自分のステップで少なくとも50% :

  1. はRCPこんにちはテンプレートを使用して、新しいプラグインプロジェクトorg.cljtest42を作成Clojureの1.3.0のjarファイルをラップする新しいプラグインプロジェクト、設定プラグインID org.clojure.v1.3.0

  2. を作成

    1. が(AOTのコンパイルを有効にする)CCWプロジェクトの本質を追加
    2. org.clojureプラグインの依存関係を追加し、このステップはまた、エクスポートしたパッケージにorg.cljtest42を追加し、クラスパスをランタイムする/classesフォルダを追加するには、[編集] plugin.xml/classesフォルダ
    3. を追加します。
  3. org.cljtest42パッケージ/名前空間内の2つの単純な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. トリガーAOTコンパイルプロジェクトノードを開き、「実行」>「Clojureアプリケーション」(/classesフォルダには、コンパイルされたclojureクラスが設定されます)。これまでのところ - (も)(Perspective.createInitialLayoutにしようとした、例えばスタートで())

とても良いActivatorクラスから

  • リファレンスTestClassを。

    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) 
    

    より多くの知識豊富誰かがこの問題を克服することができる方法のいくつかのポインタを共有することができれば、それは優れた次のようになります。しかし、Eclipseアプリケーションは、常にこれに失敗したとして、このプロジェクトを実行しようとしています。 AOTコンパイルされたクラスが実際にクラスパスに終わっていない(なぜ?、/ classesが明示的に追加されているのか分かりません)か、別のClojureプラグインがEquinox/OSGIの方法でそれらにアクセスできないからです作品ですか?

    ありがとうございます!

  • 答えて

    1

    Clojureバンドルはバンドルのクラスを表示しませんが、エクスポートしても問題はないようです。これは、OSGi(あなたが知っているように)では、バンドルがクラスを見ることができるようにするために、そのパッケージをインポートする必要があるからです。

    しかし、バンドルが呼び出されたバンドルからクラスをロードする必要がある場合はどうでしょうか。これが機能するためには、Eclipseは、まさにこのような場合のために設計されているbuddy policiesを実施しています

    1. あなたのClojureのバンドルマニフェストヘッダーEclipse-BuddyPolicy: [dependent|registered]を持っている必要があります。
    2. あなたがEclipse-BuddyPolicy: registeredを追加した場合、あなたはClojureのを使用した、バンドルにマニフェストヘッダを追加する必要があります。Eclipse-RegisterBuddy: <clojure-bundle-name>

    免責事項:私はClojureのの経験を持っていないが、私は撮りたかったですこれでショット。

    +0

    これは機能します。追加の注意がいくつかあります。 1)Clojureランタイムプラグインでは、jarファイル内のすべてのパッケージをエクスポートする必要があります。 2)ランタイムプラグインでは 'Eclipse-BuddyPolicy:registered'を使用し、従属プラグインでは' Eclipse-RegisterBudy'エントリを使用してください。 3)依存プラグインがClojureランタイムプラグインに直接依存しない他のプラグインによって呼び出された場合、依存プラグインはClojureランタイム依存関係を再エクスポートする必要があります。 – Bill

    +0

    これはおそらく十分な回避策ですが、これを行う適切な方法は、Clojure AOTが実際に必要なインポートをバンドルに注入するためです。そのため、OSGi仕様の回りにEclipseバディを使用する必要はありません。しかし、これはClojure AOTに正しいことをさせる必要があります。 –

    +0

    これはあなたがあなたのクローゼットコードをAOTに喜んでいることを前提としています。 – Bill

    関連する問題