2012-08-22 8 views
10

Jestem dość prostą potrzebą użycia klasy Ruby z Clojure. Czynnikami komplikującymi są to, że klasa jest dostarczana w klejnocie. Optymalnym rozwiązaniem byłoby, aby skonfigurować mój plik projektu Leiningein wzdłuż linii:Używanie klasy JRuby dostarczanej w klejnocie od Clojure

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

Podobnie wolałbym po prostu sprawdzić klejnot i jego zależności w lokalnym katalogu repo. Dlatego z mojego idealnego zastosowania będzie to:

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

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

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

Dzięki.

Odpowiedz

10

Oto krótka lista kroków, aby uzyskać hello-world gem działające przy użyciu JRuby i Clojure oraz kilka odniesień. W rzeczywistości, kroki składają się na krótki szkic, w jaki sposób materiał z referencji może się połączyć (z pewnymi wpisami project.clj). Pierwszy odnośnik, Haml on Clojure Web App na blogu Yoko Harady (@ yokolet), w nieco inny sposób odwołuje się do JRuby, ale zawiera kluczową uwagę na temat pisania linii JRuby i gemów w ścieżce klas.

  1. Dodaj [org.jruby/jruby-complete "1.6.7.2"] do :dependencies i nie Leiningen sprowadzić zależności.

  2. Tworzenie gems katalog w katalogu głównym projektu i dodać go do :resource-paths w project.clj Wymaga to Leiningen 2. Patrz Leiningen source w odpowiednim formacie.

  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 
    

    w katalogu głównym projektu.

  4. Uruchom wybraną usługę REPL, korzystając z zestawu GEM_HOME i GEM_PATH, jak powyżej. (I przetestowane z lein2 swank).

  5. powiedzieć, co następuje w 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. Oto wartość nil powrotnej, a także kilka linii drukowany do terminala usługi REPL ma został rozpoczęty od.

Referencje:

  1. Haml on Clojure Web App na (@ yokolet za) Blog Yoko Harada za
  2. JRuby 1.1.6: Gems-in-a-jar na blogu Nick Sieger za
  3. DirectJRubyEmbedding na jruby Wiki na projektu Kenai
  4. consuming gems from jruby-complete tutaj na SO (zauważ komentarze)
+3

Działa doskonale, dziękuję. Jedyną zmianą, którą musiałem wprowadzić, było zaimportowanie 'JavaEmbedUtils' przed wykonaniem powyższej komendy. – fogus

+1

Musiałem wykonać następujące czynności, aby go uruchomić: (ns try-jruby.core (import org.jruby.javasupport.JavaEmbedUtils)) – firesofmay