2012-08-22 9 views
10

Tôi là một nhu cầu khá đơn giản khi sử dụng lớp Ruby từ bên trong Clojure. Các yếu tố phức tạp là lớp được cung cấp bằng đá quý. Phương pháp tối ưu sẽ được thiết lập hồ sơ dự án Leiningein tôi dọc theo dòng:Sử dụng lớp JRuby được cung cấp bằng đá quý từ Clojure

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

Tương tự như vậy tôi muốn chỉ đơn giản là kiểm tra đá quý và phụ thuộc của nó vào thư mục repo địa phương. Do đó, từ cách sử dụng lý tưởng của tôi thì sẽ là:

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

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

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

Cảm ơn.

Trả lời

10

Dưới đây là danh sách ngắn các bước để có được hello-world gem chạy bằng JRuby và Clojure và một vài tham chiếu. Trong thực tế, các bước soạn thảo chỉ là một bản phác thảo ngắn về cách các tài liệu từ các tài liệu tham khảo có thể đến với nhau (với một số mục project.clj). Tham chiếu đầu tiên, Haml on Clojure Web App trên blog của Yoko Harada (@ yokolet), sử dụng một cách hơi khác để gọi JRuby, nhưng bao gồm nhận xét chính về cách viết require("...") đường để sử dụng với JRuby và đá quý trên đường dẫn lớp.

  1. Thêm [org.jruby/jruby-complete "1.6.7.2"] vào :dependencies và có Leiningen tìm nạp phụ thuộc.

  2. Tạo một thư mục gems trong thư mục gốc của dự án và bổ sung nó vào :resource-paths trong project.clj của bạn Điều này đòi hỏi Leiningen 2. Xem Leiningen source cho định dạng đúng.

  3. Say

    # 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 
    

    trong thư mục gốc của dự án.

  4. Bắt đầu dịch vụ REPL theo lựa chọn của bạn với GEM_HOMEGEM_PATH đặt như trên. (Tôi đã thử nghiệm này với lein2 swank.)

  5. Nói sau tại 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. Kìa, giá trị nil trở lại, cũng như một vài dòng in ra để nhà ga dịch vụ REPL có được bắt đầu từ.

Tài liệu tham khảo:

  1. Haml on Clojure Web App trên Yoko Harada của (@ yokolet của) blog của
  2. JRuby 1.1.6: Gems-in-a-jar trên blog của Nick SIEGER của
  3. DirectJRubyEmbedding trên JRuby Wiki tại Dự án Kenai
  4. consuming gems from jruby-complete đây trên SO (lưu ý các ý kiến)
+3

Làm việc hoàn hảo, cảm ơn bạn. Thay đổi duy nhất mà tôi cần thực hiện là nhập 'JavaEmbedUtils' trước khi thực hiện lệnh trên. – fogus

+1

Tôi phải làm như sau để làm cho nó hoạt động: (ns try-jruby.core (nhập org.jruby.javasupport.JavaEmbedUtils)) – firesofmay