9

我非常简单地需要在 Clojure 中使用 Ruby 类。复杂的因素是该类是在 gem 中提供的。最佳方法是按照以下方式设置我的 Leiningein 项目文件:

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

同样,我更愿意简单地将 gem 及其依赖项检查到本地 repo 目录中。因此,从我的理想用法来看,应该是:

(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

hello-world以下是使用 JRuby 和 Clojure 运行gem的简短步骤列表以及一些参考资料。事实上,这些步骤只是一个简短的草图,说明了参考资料中的材料如何组合在一起(带有一些project.clj条目)。第一个参考文献是 Yoko Harada (@yokolet's) 博客上 Clojure Web App上的 Haml,它实际上使用了一种稍微不同的方式来调用 JRuby,但其中包含关于如何编写require("...")用于 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_HOME并按GEM_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. 看看nil返回值,以及打印到启动 REPL 服务的终端的几行代码。

参考:

  1. Haml 在Yoko Harada (@yokolet's) 博客上的Clojure Web 应用程序
  2. JRuby 1.1.6: Nick Sieger 博客上的Gems-in-a-jar
  3. 在 Project Kenai 的 JRuby Wiki 上的DirectJRubyEmbedding
  4. 在 SO 上使用 jruby-complete 中的宝石(注意评论)
于 2012-08-22T18:06:05.947 回答