2012-08-22 13 views
10

Clojure içinden Ruby sınıfını kullanmak oldukça basit bir ihtiyacım var. Zorlayıcı faktörler, sınıfın bir gemide sunulmasıdır. Clojure'dan bir gemide verilen JRuby sınıfını kullanma

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

Aynı şekilde ben sadece yerel repo dizine mücevher ve bağımlılıklarını kontrol etmeyi tercih ediyorum: optimal yaklaşım kurulum için çizgisinde benim Leiningein proje dosyası olacaktır. Bu nedenle, ideal kullanımımdan şu şekilde olur:

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

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

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

Teşekkürler.

cevap

10

İşte JRuby ve Clojure ve birkaç referans kullanarak hello-world gem çalışan çalıştırmak için adımların kısa bir listesi. Aslında, adımlar referanslardan gelen malzemenin nasıl bir araya gelebileceğinin kısa bir taslağını oluşturuyor (bazı project.clj girişleriyle). İlk referans, Yoko Harada (@ yokolet) blogu üzerinde Haml on Clojure Web App, aslında JRuby aramak için biraz farklı bir şekilde kullanır, ama JRuby ve sınıf yolunda taşlar ile kullanmak için require("...") satırları yazmak için anahtar açıklama içerir.

  1. sizin :dependencies için [org.jruby/jruby-complete "1.6.7.2"] ekleyin ve Leiningen bağımlılıklarını getirme var.
  2. Bu Leiningen doğru formatta için Leiningen source bakınız 2. gerektirir proje kök bir gems dizin oluşturun ve project.clj yılında :resource-paths ekleyin.

  3. proje kök

    # 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 
    

    söyle.

  4. Seçtiğiniz REPL hizmetini yukarıdaki gibi ayarlanmış GEM_HOME ve GEM_PATH ile başlatın. (I lein2 swank ile test edilmiştir.)

  5. Çoğaltma aşağıdaki ki:

    ;;; 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 dönüş değeri, hem de REPL hizmet sahip terminale çıktısı çizgiler bir çift Hani başladı.

Referanslar: SO üzerinde

  • consuming gems from jruby-complete burada Yoko Harada en (@ yokolet en) blogunda Proje Kenai de JRuby Wiki Nick Sieger blogunda
  • DirectJRubyEmbedding üzerinde
  • JRuby 1.1.6: Gems-in-a-jar üzerinde

    1. Haml on Clojure Web App (yorumları not edin)
  • +3

    Mükemmel bir şekilde çalışıyor, teşekkürler. Yapmam gereken tek değişiklik, yukarıdaki komutu çalıştırmadan önce “JavaEmbedUtils” ini almaktı. – fogus

    +1

    Çalışmak için aşağıdakileri yapmak zorundaydım: (ns try-jruby.core (import org.jruby.javasupport.JavaEmbedUtils)) – firesofmay

    İlgili konular