9

私は、Clojure 内から Ruby クラスを使用するというかなり単純な必要性があります。複雑な要因は、クラスが gem で提供されることです。最適なアプローチは、次の行に沿って Leiningein プロジェクト ファイルをセットアップすることです。

(project foo ""
  ...
  :dependencies [[clojure ...]
                 [jruby ...  ]])

同様に、gem とその依存関係をローカルのリポジトリ ディレクトリにチェックインすることをお勧めします。したがって、私の理想的な使用法からは次のようになります。

(ns bar.baz
  (require [jruby.something :as jruby])

(def obj (jruby/CreateAnInstance "TheGemClass"))

(def result (jruby/CallAMethod obj "method_name" some args))

ありがとう。

4

1 に答える 1

9

以下は、 JRuby と Clojure を使用してhello-worldgemを実行する手順の短いリストと、いくつかのリファレンスです。実際、これらの手順は、参照からの資料がどのように組み合わされるか (いくつかのproject.cljエントリを含む) の短いスケッチを構成します。最初のリファレンスである、Yoko Harada (@yokolet) のブログにあるClojure Web App の Hamlrequire("...")は、実際には少し異なる方法で JRuby を呼び出していますが、JRuby で使用する行の書き方と、クラスパス上の gem に関する重要なコメントが含まれています。

  1. に追加[org.jruby/jruby-complete "1.6.7.2"]して:dependencies、Leiningen に依存関係を取得させます。

  2. gemsプロジェクト ルートにディレクトリを作成し、これに追加:resource-pathsします。project.cljこれには Leiningen 2 が必要です。正しい形式については、 Leiningen のソースを参照してください。

  3. 言う

    # see reference 4
    GEM_HOME=gems GEM_PATH=gems java -jar ~/.m2/repository/org/jruby/jruby-complete/1.6.7.2/jruby-complete-1.6.7.2.jar -S gem install hello-world
    

    プロジェクトルートで。

  4. 選択した REPL サービスを起動し、上記のようGEM_HOMEGEM_PATH設定します。(これを でテストしましたlein2 swank。)

  5. REPL で次のように言います。

    ;;; see reference 2, first snippet
    (let [runtime (JavaEmbedUtils/initialize (list))
          evaler  (JavaEmbedUtils/newRuntimeAdapter)]
      (doseq [ruby-expr ["require('rubygems')"
                         "require('gems/hello-world-1.2.0/lib/hello-world')"]]
        (.eval evaler runtime ruby-expr)))
    
  6. 戻り値と、 REPLnilサービスが開始された端末に出力された数行を見てください。

参考文献:

  1. 原田陽子 (@yokolet) のブログのClojure Web App の Haml
  2. JRuby 1.1.6: Nick Sieger のブログのGems-in-a-jar
  3. Project Kenai の JRuby Wiki でのDirectJRubyEmbedding
  4. SO でjruby-complete の gem を消費する (コメントに注意)
于 2012-08-22T18:06:05.947 に答える