2017-02-03 8 views
7

से जार फ़ाइलों और कक्षाओं को जोड़ें और हटाएं मूल रूप से मेरे पास जावा एक प्रणाली है जो उपयोगकर्ता द्वारा स्थापित जेआरई के आधार पर या तो राइनो या नैशॉर्न के माध्यम से जावास्क्रिप्ट का उपयोग करके कई "प्लगइन" स्क्रिप्ट चलाती है।अंदर जावास्क्रिप्ट (राइनो/नैशर्न)

मेरे पास जावा वातावरण के भीतर एक प्रणाली भी है जो रनटाइम पर अतिरिक्त .JAR फ़ाइलों को प्लग करने की अनुमति देती है।

यह सब ठीक और बेवकूफ है। हालांकि अब मैं एक ऐसी परिस्थिति में आया हूं जहां मुझे थोड़ा अलग चाहिए: मैं से राइनो/नैशॉर्न इंजन इंस्टेंस के भीतर क्लासपाथ में एक .JAR फ़ाइल लोड करना चाहता हूं, इसलिए कक्षाएं उस उदाहरण के लिए उपलब्ध हैं (और वह उदाहरण केवल), और उसके बाद इंजन हटाते हैं जब इंजन चल रहा है।

मुझे पता है कि मैं जावास्क्रिप्ट के साथ .JAR फ़ाइल के यूआरएल को लोड करने के लिए आसानी से अपने मौजूदा जावा रूटीन को कॉल कर सकता हूं, हालांकि कक्षाएं तब स्थायी रूप से स्थापित की जाती हैं और मैं उनसे छुटकारा नहीं पा सकता हूं।

समस्या मूल रूप से इस तथ्य से उत्पन्न होती है कि उपयोगकर्ता के विभिन्न संस्करणों के साथ कई प्लगइन हो सकते हैं। जेएआर फ़ाइल (यह किसी तीसरे पक्ष द्वारा प्रदान की जाती है और विभिन्न तरीकों से कई अलग-अलग प्लगइन के लिए उपयोग की जाती है), और मुझे प्लगइन्स चाहिए सही लोड करने में सक्षम होने के लिए और फिर इसे बाद में डुबोएं।

मेरे मौजूदा यूआरएल लोडर है:

public static void addURL(URL u) { 
    final Class[] parameters = new Class[]{URL.class}; 
    URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader(); 
    Class sysclass = URLClassLoader.class; 

    try { 
     Method method = sysclass.getDeclaredMethod("addURL", parameters); 
     method.setAccessible(true); 
     method.invoke(sysloader, new Object[]{u}); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

अब मैं वास्तव में है एक सुराग के ज्यादा है कि कैसे काम करता है की जरूरत नहीं - मैं एक शक्ति जावा प्रोग्रामर (मैं क्या C/C++ मुख्य रूप से) नहीं हूँ। मुझे पता है कि आप URLClassLoader से एक यूआरएल "अनलोड" नहीं कर सकते हैं, इसलिए मैं यह नहीं पूछ रहा हूं। मुझे लगता है कि सबसे अच्छा क्या होगा, अगर कोई तरीका है तो मैं .JAR फ़ाइल को "अस्थायी" URLClassLoader में जोड़ सकता हूं जिसे मैं निष्पादन के अंत में खो देता हूं। या किसी भी तरह से मैं कक्षाओं को सीधे स्क्रिप्ट इंजन में लोड कर सकता हूं, न कि मुख्य जावा क्लासपाथ।

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

उत्तर

5

प्लगइन विशिष्ट कक्षाओं को अलग करने के लिए, आपको एक अलग (कस्टम) क्लास लोडर इंस्टेंस बनाने और जावा स्क्रिप्ट इंजन में पास करने की आवश्यकता हो सकती है। विशेष वर्ग लोडर द्वारा लोड की गई कोई भी कक्षा केवल विशेष जावा स्क्रिप्ट इंजन के लिए दिखाई देगी।

मुझे this answer मिला जो ScriptEngine के संदर्भ में वर्ग लोडर का वर्णन करता है।

मुझे आशा है कि इससे आपको सही दिशा में आगे बढ़ने में मदद मिलेगी।

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