2011-11-23 13 views
8

मैं सोच रहा था कि क्लोजर में ग्रहण प्लगइन्स विकसित करने का कोई तरीका है या नहीं। स्पष्ट होने के लिए, प्रश्न क्लोजर कोड लिखने के लिए ग्रहण का उपयोग करने के बारे में नहीं है।क्लोजर में ग्रहण प्लगइन्स कैसे विकसित करें?

ग्रहण और क्लोजर दोनों जेवीएम पर चलते हैं और मुझे लगता है कि प्लगइन विकसित करने के लिए क्लोजर (और इसकी पुस्तकालयों) की शक्ति का लाभ उठाने का तरीका होना चाहिए। मैं विशेष रूप से कोर्मा का उपयोग करने के लिए देख रहा था, लेकिन कुल मिलाकर मैं पूरी तरह से प्लग-इन को क्लोजर में ले जाना चाहता हूं यदि ऐसा करने का प्राकृतिक तरीका है।

+0

इसके बारे में सोचने के बाद थोड़ा सा दिमागी तूफान था और ओएसजीआई और क्लोजर की खोज की और ओएसजीआई के तहत चल रहे क्लोजर के बारे में इस ब्लॉगपोस्ट में आया (http://www.talios.com/clojure_running_succ essfully_under_osgi.htm) और एक [ईमेल थ्रेड] (http://osdir.com/ml/clojure/2009-10/msg00113.html) का अर्थ है कि यह एक अच्छा विचार नहीं है। थोड़ा सा उलझा हुआ। – Punit

उत्तर

10

वामावर्त, Clojure के लिए ग्रहण प्लगइन, मिश्रित जावा और Clojure में लिखा है। यह अभी तक clojure.osgi 1.2.10 का उपयोग करता है।

तो यह अवधारणा के एक जीवित सबूत है कि यह संभव है। और AFAIK, सैकड़ों लोगों द्वारा काउंटरक्लॉक वार का सफलतापूर्वक उपयोग किया जाता है।

वहाँ, कुछ कमी कर रहे हैं यद्यपि: Clojure के नाम स्थान "वैश्विक" कुछ "रूट classloader" है। E.G. यदि आप क्लोजर को नामित बंडल के अंदर पैकेज करते हैं, तो myapp.clojure कहें, तो आपके पास शायद अन्य बंडलों का एक गुच्छा होगा जिसके लिए myapp.clojure की आवश्यकता होगी। उदाहरण के लिए कहें myapp.bundle1, myapp.bundle2। जब आप ऐसा करते हैं, और, प्रत्येक बंडल से, बंडल नेमस्पेस मेमोरी (आवश्यकता) में लोड होते हैं, प्रत्येक को दाएं क्लासलोडर के भीतर से लोड किया जाएगा (myapp.bundle1 के नामस्थान myapp.bundle1 के संदर्भ क्लासलोडर के भीतर लोड हो जाएंगे, और myapp.bundle2 के नामस्थान myapp.bundle2 के संदर्भ क्लासलोडर के भीतर लोड हो जाएंगे)। यह बहुत अच्छा है, क्योंकि यह जावा इंटरऑप को ठीक काम करने की इजाजत देता है।

लेकिन बस याद रखें कि अंत में, बंडल 1 & बंडल 2 से लोड किए गए नामस्थान बंडल myapp.clojure में "वैश्विक नामस्थान दुनिया" द्वारा आयोजित किए जाएंगे।

ईमानदारी से कहूं तो यह अभी तक वामावर्त के लिए एक समस्या साबित नहीं हुआ है। क्योंकि एक ही फ़ीचर के अंदर, बंडल साझा करने के बाद एक सिंगल क्लोजर इंस्टेंस लगभग ठीक है।

संभावित कमियां हैं:

  • अगर आप तीसरे पक्ष के पुस्तकालयों, उदा का उपयोग tools.logging, आप myapp.bundle1 में नेमस्पेस नहीं रख पाएंगे टूल.लॉगिंग के संस्करण एक्स पर निर्भर करते हैं, और साथ ही myapp.bundle2 tools.logging के संस्करण वाई पर निर्भर करता है। यही है, आपकी सुविधा के अंदर जहां आपके पास बंडल myapp.clojure के माध्यम से एक साझा क्लोजर है, उदाहरण के लिए, यदि आप वेबएप काम करते हैं, तो आप ओएसजीआई नियम लागू नहीं करते हैं।
  • बड़े पैमाने पर लागू होने पर अच्छी तरह से स्केल नहीं करता है: यदि प्रत्येक ग्रहण फ़ीचर क्लोजर के अपने संस्करण को दोबारा बनाना था, तो स्मृति की कुछ अपशिष्ट होगी। लेकिन यह कमी व्यावहारिक से अधिक सैद्धांतिक है, फिर भी। और यह एक समस्या है जिसे बाद में संबोधित किया जा सकता है, जब इसकी आवश्यकता उभरती है।

ध्यान दें कि एक ग्रहण आरसीपी उत्पाद के लिए, ग्रहण प्लगइन के विपरीत, ये दोष गायब हो जाते हैं।

आप देखना चाहते हैं कि वामावर्त clojure repackaged है चाहते हैं, और clojure.osgi का उपयोग करता है, तो आप अपने sourcecode देख सकते हैं:

http://github.com/laurentpetit/ccw.clojure.git http://github.com/laurentpetit/ccw.git

HTH,

- लौरेंत

4

ऐसा लगता है यह ग्रहण 3.x में उपलब्ध नहीं है, लेकिन जैसा कि http://wiki.eclipse.org/E4/Languages में उल्लेख किया है, ग्रहण 4 के लिए योजना बनाई है।

वहाँ भी a post here on Stack Overflow asking about development of Eclipse plugins in languages other than Java अधिक जानकारी है कि आप उपयोगी पाते हैं हो सकता है है।

3

Groovy या Scala में एक्लिप्स प्लग-इन लिखना पूरी तरह से संभव है। चूंकि क्लोजर .class फ़ाइलों का उत्पादन करता है, यह अलग नहीं होना चाहिए। हालांकि, प्लगइन सामान्य रूप से पीडीई बिल्ड का उपयोग करके निर्यात किया जाता है, जो केवल जावा को डिफ़ॉल्ट रूप से संभालता है, इसलिए आपको customCallback.xml फ़ाइल लिखनी होगी जो क्लोजर संकलित कर सकती है (स्केल बिल्ड के लिए http://www.michel-kraemer.com/scala-projects-with-eclipse-pde-build-2 देखें)।

संबंधित मुद्दे