2010-07-13 11 views
6

Hallo,getResourceAsStream नए पर्यावरण के तहत विफल रहता है?

मैं निम्न कोड पंक्ति है:

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 

और मैं com/thinkplexx/लैंग/डी/general.xml साथ कि जार classpath में है।

यह "पिछले पर्यावरण" के तहत काम करता है, जो maven2 build है।

अब, मैं maven3 का मूल्यांकन करता हूं और यह काम नहीं करता है! मैं जानता हूँ कि, कि अगर मैं कोड बदल होने के लिए:

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("com/thinkplexx/lang/de/general.xml"); 

यह काम करता है महान (मैं सिर्फ संसाधन पथ से पहले स्लैश हटा दिए गए)।

बीटीडब्ल्यू, मैं लिनक्स का उपयोग करता हूं। पथ में पहला स्लैश सामान्य रूप से "मूल निर्देशिका से" होता है, इसलिए यदि यह तर्क जावा संसाधन लोडिंग के लिए भी अच्छा है, तो पहले उदाहरण को कभी काम नहीं करना चाहिए था ??

प्रश्न: कुछ पहले कोड नमूने के साथ गलत है, यानी साथ /com/ और है नहीं com/? क्या यह सिर्फ खराब कोड है या इसका मतलब कुछ अलग है?

धन्यवाद!

+0

डेवन्स का जवाब मेरे लिए काम करता है। इसके अलावा, मुझे में मिला http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/guide/lang/resources.html कि: " क्लासलोडर में विधियां दिए गए स्ट्रिंग का उपयोग करती हैं किसी भी पूर्ण/सापेक्ष परिवर्तन को लागू किए बिना संसाधन का नाम (कक्षा में विधियों को देखें)। नाम में अग्रणी नहीं होना चाहिए "/" " –

उत्तर

7

यह इस बात पर निर्भर करता है कि आप संसाधन कैसे प्राप्त कर रहे हैं। जब आप के रूप में एक ClassLoader का उपयोग करें:

InputStream stream= getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 

अग्रणी '/' अर्थहीन है। तो, सही रूप "com/thinkplexx/lang/de/general.xml" है।

, तो इसके बजाय आप के रूप में, एक 'क्लास' का उपयोग करें:

InputStream stream= getClass().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 

आप एक अलग व्यवहार मिलता है। Class.getResourceAsStream बिना किसी अग्रणी 'कक्षाओं पर विचार करेगा। वर्ग युक्त पैकेज के सापेक्ष होने के लिए। एक अग्रणी '।' के साथ निर्दिष्ट संसाधन जार की जड़ के सापेक्ष पूर्ण, या हल हो गए हैं।

तो, अगर thiscom.example.SomeThing लिए एक संदर्भ है, तो अपेक्षित व्यवहार है:

getClass().getResourceAsStream("https://stackoverflow.com/a/b/c.xml") ==> a/b/c.xml 
getClass().getResourceAsStream("a/b/c.xml") ==> com/example/a/b/c.xml 
getClass().getClassLoader().getResourceAsStream("a/b/c.xml") ==> a/b/c.xml 
getClass().getClassLoader().getResourceAsStream("https://stackoverflow.com/a/b/c.xml") ==> Incorrect 

Maven2 ढीला किया जा रहा था और पिछले रूप की इजाजत दी।

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