2010-03-31 12 views
8

यदि मेरे पास मेरे क्लासपाथ पर निर्देशिका में संसाधन फ़ाइलों का संग्रह है, तो मैं उन्हें 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 में हैं पैदा करता है।

+0

मैंने पहले कभी व्यवहार में इस अंतर को पार नहीं किया है, लेकिन मैं ऐसी परिस्थिति की कल्पना कर सकता हूं जहां एक दिए गए क्लासलोडर कार्यान्वयन को एक जार में पैक किए जाने पर संसाधन के रूप में यूआरएल के रूप में व्यक्त नहीं किया जा सका। जिन सर्वरों के साथ मैंने काम किया है (जेबॉस/टोमकैट) * हालांकि, ऐसा कर सकते हैं। – skaffman

उत्तर

0
this.getClass().getClassLoader().getResourceAsStream(location); 
+1

निश्चित रूप से, मैं getResources (स्थान) के बजाय getResourceAsStream (स्थान) का उपयोग कर सकता हूं लेकिन यह मेरी समस्या को हल करने या समझने में मेरी सहायता नहीं करता है जब तक कि मुझे कुछ याद नहीं आया? – Brabster

1

हालांकि मैं सवालों का आपके लिए पूछने के लिए ठीक एक समाधान सुझाने के लिए है, मैं इस सरल कदम जो मदद कर सकते हैं संसाधनों खोजने की कोशिश करने के लिए कह सकते हैं। मेरा मानना ​​है कि संसाधन लोड करने के लिए आप जिस क्लास लोडर का उपयोग कर रहे हैं वह संसाधनों को ढूंढने में असमर्थ है। तो अगर आप नीचे के रूप में (एक काम के अधिक के आसपास) की कोशिश कर सकते हैं:

  1. एक सरल खाली वर्ग (उदाहरण के लिए, ResourceGetter.class) जार में अन्य संसाधनों के साथ-साथ कक्षा बनाएं
  2. पैकेज। इस वर्ग को अन्य संसाधनों के रूप में फ़ोल्डर पदानुक्रम के समान स्तर पर पैक किया जाना चाहिए। जार के अंदर, उदाहरण के लिए:

    /resources/ResourceGetter.class

    /resources/myprop.properties ....

  3. उपयोग ResourceGetter.class.getClassLoader() getResourceAsStream() या getResources।() अपने कोड में जहां आप इन संसाधन फ़ाइलों को चाहते हैं।

यदि आप संसाधनों तक पहुंच सकते हैं, तो आप क्लास लोडर को लोड कर सकते हैं जो इसे लोड करता है और आप अपनी समस्या को हल करने के लिए वहां कर सकते हैं।

+0

हे @ सुगा जीनियस, मैंने इस छः साल पहले पोस्ट किया था, मुझे याद नहीं है कि मुझे इस समस्या में फिर दिलचस्पी क्यों थी, या यहां तक ​​कि कंटेनर क्या था! हालांकि मदद करने की कोशिश करने के लिए +1! – Brabster

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