2011-01-20 16 views
12

के बाद सर्वोत्तम प्रथाओं द्वारा लोड संसाधनों, मैं एक वेब अनुप्रयोग (पाठ फ़ाइलों या एक्सएमएल फ़ाइलें की तरह) में संसाधनों के लोड होने Thread.currentThread().getContextClassLoader().getResourceAsStream उपयोग कर रहा हूँ, बजाय फ़ाइल एपीआई के माध्यम से जाने की।को पुन: लोड getResourceAsStream

हालांकि, इस नुकसान यह है कि अगर डिस्क पर संसाधन परिवर्तन, getResourceAsStream को एक के बाद कॉल को अनिश्चित काल के पुराने संस्करण लौटने रहता है।

हालांकि मैं इसे नया संस्करण चुनना चाहता हूं। मेरे डीबगर में मुझे लगता है कि क्लासलोडर में resourceEntries नामक एक सरल हैश मैप है। प्रतिबिंब का उपयोग करके मैं एक विशिष्ट प्रविष्टि को हटाने में सक्षम हूं और ऐसा लगता है कि यह काम करता है।

यह विधि हालांकि नाजुक है।

क्या ऐसा करने के लिए एक और मानक तरीका है?

+0

'क्लासलोडर' का सटीक कार्यान्वयन क्या है जो उसमें है? – Bozho

+0

इस मामले में यह टॉमकैट 5 में '' org.apache.catalina.loader.WebappClassLoader'' था। मैंने अभी तक नए टॉमकैट संस्करणों में कोशिश नहीं की है, लेकिन मैंने अभी इसे जेबॉस में आजमाया है और यह वहां काम नहीं करता है (जैसा सोचा था)। – akira

उत्तर

1

kschneid के जवाब के अलावा वास्तव में बिलाव के लिए काम कर सकते हैं जो में, मुझे लगता है कि जोड़ने के लिए JBoss के लिए के रूप में 5 + यह पहले से ही किसी विशेष चाल की जरूरत के बिना काम करने के लिए लगता है चाहता था।

संसाधनों का कैशिंग शायद क्लास लोडर विशिष्ट है। जेबॉस एएस एक या तो कैश नहीं करता है या यह देखने के लिए पर्याप्त स्मार्ट है कि डिस्क पर संसाधन बदल गया है।

6

इस प्रयास करें:

ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader(); 
URL resURL = ctxLoader.getResource(resName); 
URLConnection resConn = resURL.openConnection(); 
resConn.setUseCaches(false); 
InputStream resIn = resConn.getInputStream(); 
... 
संबंधित मुद्दे