2011-04-09 13 views
5

से संसाधन लोड करने के लिए कैसे मैं एक एम्बेडेड जेएआर फ़ाइल में निहित संसाधन लोड करने की कोशिश कर रहा हूं। परियोजना वास्तव में JBoss में तैनात किया जाता है निम्नलिखित संरचना के साथ एक EAR फ़ाइल का उपयोग:एम्बेडेड जेएआर फ़ाइल

deploy.ear 
| 
|-> project.sar 
    | 
    |-> sub_project.jar 
    | | 
    | |-> settings.xml 
    | 
    |-> com/path/project/ 
     | 
     |-> main.class 

main.java से मैं एक InputStreamsettings.xml के लिए प्राप्त करना चाहते हैं। ऐसा करने का सही तरीका क्या है?

मेरे वर्तमान समझ है कि निम्नलिखित कोड काम करना चाहिए, लेकिन यह null लौटा रहा है:

this.getClass().getResourceAsStream("settings.xml"); 

अद्यतन

कुछ परीक्षण और त्रुटि के बाद, निम्नलिखित बयानों काम:

getClass().getResourceAsStream("/settings.xml"); 
getClass().getResourceAsStream("/sub_project.jar/settings.xml"); 
getClass().getClassLoader().getResourceAsStream("/settings.xml"); 
getClass().getClassLoader().getResourceAsStream("settings.xml"); 
getClass().getClassLoader().getResourceAsStream("sub_project.jar/settings.xml"); 
getClass().getClassLoader().getResourceAsStream("/sub_project.jar/settings.xml"); 
+0

जावा वर्ग लोडर का उपयोग कर प्राप्त कर सकते हैं एम्बेडेड जार से लोड संसाधन नहीं कर सकते, तो अपने सेट अप नहीं किया जाएगा काम। एक जार समाधान इस समस्या को हल करता है, ईरान का जवाब देखें। – MeBigFatGuy

+1

सुनिश्चित नहीं है कि /sub_project.jar/settings.xml एक मानक नोटेशन है। जेबॉस एक्सटेंशन हो सकता है। –

+0

मुझे आश्चर्य हुआ कि "सेटिंग्स.एक्सएमएल" क्यों विफल रहा, जबकि "/settings.xml" काम करता था, लेकिन फिर मैंने प्रलेखन पढ़ा है: * यदि संसाधन का नाम "/" से शुरू होता है, तो यह अपरिवर्तित है; अन्यथा, पैकेज नाम को बदलने के बाद संसाधन नाम पर प्रीपेड किया जाता है "। "/".* क्लास.क्लास यह करता है, लेकिन ClassLoader.class नहीं करता है। आज कुछ नया सीख लिया ... –

उत्तर

2

यह एक अच्छा संसाधन हो सकता है: http://one-jar.sourceforge.net/version-0.95/

मुख्य विचार यह है कि आंतरिक जेएआर क्लासलोडर द्वारा लोड नहीं होता है जो बाहरी जेएआर स्वचालित रूप से लोड करता है, आपको मैन्युअल रूप से ऐसा करने की आवश्यकता होती है, उदा। एक StreamClassLoader का उपयोग करके अपने खुद के classloader से भीतरी जार लोड करने के लिए

उसके बाद ही, आपको लगता है कि संसाधन getResourceAsStream(...)

+0

क्या आप वन-जार का उपयोग करने का संकेत दे रहे हैं, या आंतरिक संदर्भ जार सामग्री तक पहुंचने के संदर्भ में इसका उपयोग करने के लिए बस इसका उपयोग कर रहे हैं? – cmcginty

+0

ध्यान दें कि शीर्ष वाला जार नहीं है, लेकिन ईएआर; जिसका मतलब है कि यह मानक एक से अधिक जटिल क्लासलोडर है। ईएआर क्लासलोडर मेटा-आईएनएफ सामग्री के आधार पर नेस्टेड जेएआर और डब्ल्यूएआर से लोडिंग संसाधनों को संभालते हैं। –

+2

@Vladimir: मूल प्रश्न यह नहीं बताया था। ओपी ने मूल प्रश्न में उस महत्वपूर्ण विवरण को छोड़ दिया। विस्तार के लिए प्रश्न के नीचे 'संपादित [समय] 'लिंक पर क्लिक करें। – BalusC

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