2012-08-22 8 views
10

से एक मणि में आपूर्ति की गई जेआरबी कक्षा का उपयोग करना मुझे क्लोजर के भीतर रूबी क्लास का उपयोग करने की काफी सरल आवश्यकता है। जटिल कारक यह है कि कक्षा एक मणि में आपूर्ति की जाती है।क्लोजर

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

इसी तरह मैं बस स्थानीय रेपो निर्देशिका में मणि और उसके निर्भरता जाँच करना पसंद करेंगे: इष्टतम दृष्टिकोण सेटअप करने के लिए की तर्ज पर मेरी Leiningein प्रोजेक्ट फाइल होगा। इसलिए, मेरे आदर्श उपयोग से तब होगा:

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

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

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

धन्यवाद।

उत्तर

10

जेआरबी और क्लोजर और कुछ संदर्भों का उपयोग कर hello-world gem चलाने के लिए चरणों की एक छोटी सूची यहां दी गई है। असल में, कदम केवल एक संक्षिप्त स्केच लिखते हैं कि संदर्भों की सामग्री एक साथ कैसे आ सकती है (कुछ project.clj प्रविष्टियों के साथ)। पहला संदर्भ, Haml on Clojure Web App योको हरदा के (@ योकलेट्स) ब्लॉग पर, वास्तव में जेआरबी में कॉल करने के लिए थोड़ा अलग तरीके का उपयोग करता है, लेकिन क्लासपाथ पर जेआरबी और रत्नों के उपयोग के लिए require("...") लाइनों को लिखने के बारे में महत्वपूर्ण टिप्पणी शामिल है।

  1. अपने :dependencies को [org.jruby/jruby-complete "1.6.7.2"] जोड़ें और Leiningen निर्भरता लाने की है।

  2. परियोजना जड़ में एक gems निर्देशिका बनाएँ और अपने project.clj में :resource-paths में जोड़ने के लिए यह जरुरी है Leiningen 2. सही प्रारूप के लिए Leiningen source देखें।

  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. GEM_HOME और GEM_PATH के साथ अपनी पसंद की आरईपीएल सेवा शुरू करें। (मैं lein2 swank के साथ इस परीक्षण किया गया।)

  5. आरईपीएल पर निम्न कहते हैं:

    ;;; 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 वापसी मान, साथ ही टर्मिनल आरईपीएल सेवा के लिए बाहर मुद्रित लाइनों की एक जोड़ी निहारना से शुरू किया गया

संदर्भ:

  1. योको हराडा के (@ yokolet के) ब्लॉग
  2. परियोजना Kenai पर निक फ्यूज के ब्लॉग
  3. DirectJRubyEmbedding JRuby विकी पर पर JRuby 1.1.6: Gems-in-a-jar पर इतने पर Haml on Clojure Web App
  4. consuming gems from jruby-complete यहाँ (टिप्पणियों को नोट करें)
+3

पूरी तरह से काम किया, धन्यवाद। उपरोक्त आदेश निष्पादित करने से पहले मुझे केवल एक ही परिवर्तन 'JavaEmbedUtils' आयात करना था। – fogus

+1

मुझे इसे काम करने के लिए निम्नलिखित करना पड़ा: (एनएस try-jruby.core (आयात org.jruby.javasupport.JavaEmbedUtils) – firesofmay