2012-08-22 10 views
10

Sono abbastanza semplice usare una classe Ruby da Clojure. I fattori complicanti sono che la classe è fornita in una gemma. L'approccio ottimale sarebbe quella di impostare il mio file di progetto Leiningein lungo le linee di:Utilizzo della classe JRuby fornita in una gemma di Clojure

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

Allo stesso modo io preferirei di controllare semplicemente la gemma e le sue dipendenze nella directory repo locale. Pertanto, dal mio utilizzo ideale sarebbe quindi:

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

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

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

Grazie.

risposta

10

Ecco un breve elenco di passaggi per ottenere il hello-world gem in esecuzione utilizzando JRuby e Clojure e alcuni riferimenti. In effetti, i passaggi compongono solo un breve abbozzo di come il materiale dai riferimenti potrebbe venire insieme (con alcune voci project.clj). Il primo riferimento, Haml on Clojure Web App sul blog di Yoko Harada (@ yokolet), utilizza un modo leggermente diverso per chiamare in JRuby, ma include l'osservazione chiave su come scrivere le linee require("...") da utilizzare con JRuby e le gemme sul classpath.

  1. Aggiungi [org.jruby/jruby-complete "1.6.7.2"] al vostro :dependencies e hanno Leiningen prendere le dipendenze.

  2. Creare una directory gems nella radice del progetto e aggiungerlo al :resource-paths nel vostro project.clj Ciò richiede Leiningen 2. Vedere la Leiningen source per il formato corretto.

  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 
    

    nella radice progetto.

  4. Avviare il servizio REPL di vostra scelta con GEM_HOME e GEM_PATH impostato come sopra. (Ho provato questo con lein2 swank.)

  5. dire quanto segue al 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. Ecco, il valore nil ritorno, nonché una coppia di linee stampate al terminale di servizio REPL trovi stato avviato da.

Riferimenti:

  1. Haml on Clojure Web App sul (@ di yokolet) il blog di Yoko Harada
  2. JRuby 1.1.6: Gems-in-a-jar sul blog di Nick Sieger
  3. DirectJRubyEmbedding sulla JRuby Wiki al Progetto Kenai
  4. consuming gems from jruby-complete qui su SO (notare i commenti)
+3

ha funzionato perfettamente, grazie. L'unica modifica che dovevo fare era importare 'JavaEmbedUtils' prima di eseguire il comando precedente. – fogus

+1

Ho dovuto fare quanto segue per farlo funzionare: (ns try-jruby.core (import org.jruby.javasupport.JavaEmbedUtils)) – firesofmay

Problemi correlati