यदि मेरे पास मेरे क्लासपाथ पर निर्देशिका में संसाधन फ़ाइलों का संग्रह है, तो मैं उन्हें ClassLoader.getResources(location)
का उपयोग करके गणना कर सकता हूं।क्लासपाथ पर .jar में संसाधन कैसे प्राप्त करूं?
उदाहरण के लिए यदि मेरे पास क्लासपाथ पर /mydir/myresource.properties
है, तो मैं क्लासलोडर के getResources("mydir")
पर कॉल कर सकता हूं और myresource.properties
वाले यूआरएल की गणना प्राप्त कर सकता हूं।
जब मैं एक समान संसाधन को एक .jar में पैक करता हूं, तो मुझे कॉल करते समय URL की गणना में कुछ भी नहीं मिलता है। मैंने फ़ोल्डर फ़ोल्डर को केवल उन फ़ोल्डर्स वाले जार के साथ बदल दिया है (यह एक वेबएप है, इसलिए जार /WEB-INF/lib
में जा रहा है)। नाम से अन्य संसाधनों को व्यक्तिगत रूप से प्राप्त करने के लिए मुझे getResourceAsStream(location)
का उपयोग करके कई अन्य कॉल भी मिली हैं और वे सभी ठीक काम कर रहे हैं।
संसाधनों की गणना करने के बारे में क्या अलग है जब संसाधन एक .jar में हैं?
अद्यतन - मैंने कंटेनर के बाहर व्यवहार (आईएसएच) पुन: उत्पन्न किया है। निम्न स्निपेट के परिणाम dirProperties
ऑब्जेक्ट में होते हैं जिसमें कुंजी पैकेज में संसाधन नामों पर सेट होती है, लेकिन यदि पैकेज में है .jarjar Properties.load (इनपुटस्ट्रीम) विधि के दौरान एक NullPointerException फेंकता है।
Properties dirProperties = new Properties();
dirProperties.load(this.getClass().getClassLoader().getResourceAsStream(location));
कंटेनर (बिलाव 5.5) पर एक ही कोड भी इसका अपवाद नहीं फेंकता है लेकिन एक खाली गुण आपत्ति जब फ़ाइलें एक .jar में हैं पैदा करता है।
मैंने पहले कभी व्यवहार में इस अंतर को पार नहीं किया है, लेकिन मैं ऐसी परिस्थिति की कल्पना कर सकता हूं जहां एक दिए गए क्लासलोडर कार्यान्वयन को एक जार में पैक किए जाने पर संसाधन के रूप में यूआरएल के रूप में व्यक्त नहीं किया जा सका। जिन सर्वरों के साथ मैंने काम किया है (जेबॉस/टोमकैट) * हालांकि, ऐसा कर सकते हैं। – skaffman