java जावा 9 में कक्षाएं और संसाधन लोड हो रहा है




spring-boot java-9 (2)

मैं इस लेख को InfoQ उद्धरण Reinhold पर पढ़ रहा था:

कक्षाओं और संसाधन फ़ाइलों की खोज के लिए जावा रनटाइम के लिए अभी भी जावा 9 में जावा क्लास पथ का उपयोग कर सकते हैं। यह सिर्फ जावा 9 के मॉड्यूल के साथ है, डेवलपर्स को अब कक्षा पथ की आवश्यकता नहीं है।

तो अब मेरा सवाल है: ऊपर सूचीबद्ध कार्यों को करने के लिए उचित जावा 9 तरीका क्या है? आप गतिशील रूप से लोड कैसे करते हैं उदाहरण के लिए एक छवि (सापेक्ष पथ के साथ झुकाव से कम)?

इससे भी दिलचस्प बात यह है कि कोई वर्ग कैसे उपलब्ध होगा और गतिशील रूप से निर्णय लेगा (उदाहरण के लिए जैक्सन उपलब्ध है या नहीं, और यदि ऐसा है, तो JSON क्रमबद्धता के लिए इसका उपयोग करें और यदि कुछ और उपयोग न करें)?

लेख में स्प्रिंग बूट का उल्लेख पहले से ही जावा 9 का समर्थन करता है, और स्प्रिंग बूट निश्चित रूप से बहुत गतिशील लोडिंग करता है। तो हो सकता है कि कोई स्प्रिंग से कोड की भांति जानता हो जिसे मैं देख सकता हूं?


[संपादित करें: यह उत्तर मार्क के आधिकारिक उत्तर से पहले लिखा गया था। मैंने गिटहब पर उपलब्ध एक साधारण उदाहरण प्रदान करने के लिए मेरा संशोधित किया है ।]

इस वीडियो के अनुसार , जावा 9 में क्लास लोडिंग अपरिवर्तित है।

उदाहरण के तौर पर, मान लें कि हमारे पास है:

  • एक example.jar जिसमें पैकेज net.codetojoy.example.resources में एक छवि है
  • जार को गोमांस करने के लिए, net.codetojoy.example.Composer सार्वजनिक है (और निर्यात किया जाता है, जहां लागू हो)
  • एक साधारण App क्लास जो example.jar लाइब्रेरी के रूप में उपयोग करती है और इससे छवि लोड करने का प्रयास करती है

App में प्रासंगिक कोड:

static InputStream getResourceAsStream(String resource) 
    throws Exception {

    // Load net/codetojoy/example/resource/image.jpg
    // Assume net.codetojoy.example.Composer is public/exported
    // resource is 'resource/image.jpg'

    InputStream result = Composer.class.getResourceAsStream(resource);

    return result;
}   

example.jar लिए यहां कुछ मामले दिए गए हैं। जेडीके 9 में:

पुराने फैशन, गैर मॉड्यूलर जार

example.jar एक मॉड्यूल नहीं है, कोड बस काम करता है। कक्षा लोडिंग अपरिवर्तित है।

ओपन पैकेज के साथ मॉड्यूलर जार

इस मामले में, यह module-info.java फ़ाइल है:

module net.codetojoy.example {
    // export the Composer class
    exports net.codetojoy.example;

    // image is available
    opens net.codetojoy.example.resources;
}

इस मामले में, छवि क्लाइंट द्वारा लोड की जा सकती है, क्योंकि पैकेज खुला है।

ओपन पैकेज के बिना मॉड्यूलर जार

इस मामले में, module-info.java है:

module net.codetojoy.example {
    // export the Composer class
    exports net.codetojoy.example;

    // package not opened: image not available
    // opens net.codetojoy.example.resources;
}

इस मामले में, छवि को लोड नहीं किया जा सकता है, क्योंकि मजबूत encapsulation: मॉड्यूल पैकेज खोलने से छवि की रक्षा कर रहा है।

गिटहब पर यहां पूरा स्रोत।


सबसे पहले, सीधे रिकॉर्ड सेट करने के लिए, मैंने न तो कहा और न ही ऊपर उद्धृत पाठ लिखा। मैंने इसे कभी नहीं रखा होगा। यह शामिल प्रकाशनों के हिस्से पर सिर्फ मैला रिपोर्टिंग है।

जावा 9 में क्लास लोडिंग और रिसोर्स लुकअप के बारे में समझने की सबसे महत्वपूर्ण बात यह है कि, मौलिक स्तर पर, वे नहीं बदले हैं। Class::forName और Class और ClassLoader कक्षाओं में विभिन्न getResource* विधियों का ClassLoader करके, क्लास पथ और मॉड्यूल पथ से आपका कोड लोड होने के बावजूद आप कक्षाओं और संसाधनों की खोज कर सकते हैं। । अभी भी तीन अंतर्निहित वर्ग लोडर हैं, जैसे कि जेडीके 1.2 में थे, और उनके पास समान प्रतिनिधिमंडल संबंध हैं। मौजूदा कोड के बहुत सारे इसलिए काम करते हैं, आउट ऑफ़ द बॉक्स।

जैसा कि जेईपी 261 में उल्लेख किया गया है, कुछ बारीकियों हैं: अंतर्निर्मित वर्ग लोडर का ठोस प्रकार बदल गया है, और बूटस्ट्रैप क्लास लोडर द्वारा पहले लोड किए गए कुछ वर्ग अब सुरक्षा में सुधार के लिए प्लेटफ़ॉर्म क्लास लोडर द्वारा लोड किए गए हैं। मौजूदा कोड जो मानता है कि एक अंतर्निर्मित क्लास लोडर एक URLClassLoader , या क्लास बूटस्ट्रैप क्लास लोडर द्वारा लोड किया गया है, इसलिए मामूली समायोजन की आवश्यकता हो सकती है।

एक अंतिम महत्वपूर्ण अंतर यह है कि मॉड्यूल में गैर-वर्ग-फ़ाइल संसाधन डिफ़ॉल्ट रूप से encapsulated हैं, और इसलिए मॉड्यूल के बाहर से नहीं स्थित किया जा सकता है जब तक कि उनके प्रभावी पैकेज open । अपने मॉड्यूल से संसाधन लोड करने के लिए Class या Module में संसाधन-लुकअप विधियों का उपयोग करना सबसे अच्छा है, जो ClassLoader बजाए आपके मॉड्यूल में किसी भी संसाधन का पता लगा सकता है, जो केवल open पैकेज में गैर-वर्ग-फ़ाइल संसाधनों का पता लगा सकता है एक मॉड्यूल के।





jigsaw