2010-06-22 24 views
7

हम प्लगइन का समर्थन करने के लिए हमारे जावा एप्लिकेशन को विस्तारित कर रहे हैं। इसमें से एक हिस्सा हमारे स्वयं के वर्गों से अलग प्लगइन रखने में शामिल है, इस प्रकार प्रत्येक प्लगइन अपने स्वयं के वर्ग लोडर में रहेंगे।फ़िल्टरिंग क्लास लोडर को लागू करना

हम प्लगइन को जावा फ्रेमवर्क को काम करने के लिए भी योजना बनाने की योजना बना रहे हैं, इस प्रकार इसे प्लगइन के संपर्क में आना होगा। इस जावा ढांचे में कक्षाएं भी शामिल हैं जिन्हें हमारे अपने जावा कोड से सुलभ होने की आवश्यकता होगी, इसलिए इसे अपने जावा कोड के लिए भी सुलभ होना होगा।

समस्या यह है कि यदि जावा फ्रेमवर्क सिस्टम क्लास लोडर (जहां हमारा अपना जावा कोड रहता है) में रहता है, तो हम प्लगइन को अलगाव नहीं दे सकते हैं। यदि हम जावा फ्रेमवर्क को एक अलग वर्ग लोडर से अलग करना चुनते हैं और प्लगइन क्लास लोडर के माता-पिता के रूप में इसका उपयोग करते हैं, तो जावा ढांचा हमारे स्वयं के वर्गों के लिए दृश्यमान नहीं होगा।

वर्तमान समाधान जो मुझे दिमाग में था, फ़िल्टरिंग क्लास लोडर को लागू करना था। जावा फ्रेमवर्क सिस्टम क्लास लोडर में लाइव होगा, लेकिन यह क्लास लोडर जावा फ्रेमवर्क को छोड़कर सिस्टम क्लास लोडर से सब कुछ फ़िल्टर करेगा और मैं इस क्लास लोडर को प्लगइन के पैरेंट क्लास लोडर के रूप में उपयोग करूंगा।

यहाँ यह का एक मोटा कार्यान्वयन है:

public class FilteringClassLoader extends ClassLoader { 
    private URLClassLoader _internalLoader; 

    public FilteringClassLoader(ClassLoader parent) { 
     super(parent); 

     // load our java framework to this class loader 
     _internalLoader = new URLClassLoader(...) 
    } 

    public Class<?> loadClass(String name) throws ClassNotFoundException { 
     // first, try to load from our internal class loader 
     // that only sees the java framework if that works, load the class 
     // from the system class loader and return that. otherwise, the class 
     // should be filtered out and the call to loadClass will throw as expected 
     _internalLoader.loadClass(name); 

     Class<?> retClazz = super.loadClass(name); 

     return retClazz; 
    } 
} 

हालांकि इस कई समस्याएं जिस तरह से मैं इसे देखना है:

  1. एक अलग URLClassLoader का उपयोग वर्ग फिल्टर किया जाना चाहिए की तरह लगता है, तो केवल देखने के लिए मेरे लिए एक हैक।
  2. जब कोई प्लगइन कक्षा को लोड करता है, तो कक्षा क्लास क्लास लोडर सिस्टम क्लास लोडर होगा, जो कि मैं जो हासिल करने की कोशिश कर रहा हूं उसके पूरे उद्देश्य को स्पष्ट रूप से हरा देता है।

आप इस तरह की समस्या का समाधान कैसे करते हैं?

+0

क्या यह जेआरई पुस्तकालय में 'com.sun' पैकेजों पर निर्भरताओं को पेश करने वाले लोगों से अलग है? या फिर और बाधाएं हैं? – McDowell

+0

सुनिश्चित नहीं है कि आपका क्या मतलब है –

उत्तर

2

आप इस तरह की समस्या को कैसे हल करते हैं?

ओएसजीआई गठबंधन पहले ही कर चुका है। OSGi framework पर विकिपीडिया लेख आपको कुछ विचार दे सकता है।

आप Eclipse के स्रोत कोड को देखना चाहते हैं, और देखें कि वे लोडिंग में प्लग कैसे कार्यान्वित करते हैं।

+0

क्या आपके पास ओएसजीआई के लिए कोई अन्य अच्छा परिचय लेख है? विकिपीडिया प्रविष्टि बल्कि घना लगता है। –

+0

आप इसे आजमा सकते हैं: http://aneeshkumarkb.blogspot.com/ मैं ओएसजीआई विशेषज्ञ नहीं हूं, लेकिन मैंने ग्रहण प्लग-इन को कोड किया है। –

+0

यह एक अमूल्य संसाधन है, मैंने पहले इस परियोजना के बारे में भी नहीं सुना है (जावा नौसिखिया बात कर रहे हैं)। मुझे लगता है कि यह हमारे छोटे प्लगइन ढांचे के लिए थोड़ा अधिक है, लेकिन यह निश्चित रूप से भविष्य में उपयोगी साबित होगा। –

2

यदि हम जावा फ्रेमवर्क को एक अलग वर्ग लोडर में अलग करना चुनते हैं और प्लगइन क्लास लोडर के माता-पिता के रूप में इसका उपयोग करते हैं, तो जावा ढांचा हमारे स्वयं के वर्गों के लिए दृश्यमान नहीं होगा।

अपने कोड को क्लास लोडर में रखें जो प्लगइन क्लास लोडर का एक सहकर्मी है, दोनों इंटरफ़ेस कोड क्लास लोडर के साथ माता-पिता के रूप में।

+0

यह एक अच्छा समाधान है, जब तक कि एपीआई कोड कोर ऐप कोड पर किसी भी निर्भरता से पूरी तरह से अलग किया जा सके। –

+0

मैंने इसे इस तरह से करने का भी सोचा, और स्पष्ट रूप से मैं इस समाधान को चुनने का अंत कर सकता हूं। समस्याएं हैं: (1) क्या 'मैट बी' ने कहा, हालांकि अब के लिए फ्रेमवर्क इंटरफ़ेस पूरी तरह से अलग है। (2) हमारे पास कोड के कुछ मूल टुकड़े हैं जो किसी कारण से सिस्टम क्लास लोडर को सीधे एक्सेस और एक्सेस करते हैं और यदि मैं वहां से सभी कक्षाओं को स्थानांतरित करता हूं तो यह बहुत सारे मौजूदा कोड को तोड़ सकता है। हालांकि उस कोड को ठीक करने का समय हो सकता है। –

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