2012-01-27 12 views
8

मैं अब काफी कुछ समय के लिए इस पर मेरे सिर तोड़ने किया गया है और नहीं कर सकते इस समस्या के लिए एक समाधान खोजने के:फ़ाइल और bundleresource: // URL

मैं के रूप में पैक एक कस्टम पुस्तकालय का उपयोग करता है एक ग्रहण आरसीपी अनुप्रयोग है जार। प्लगइन से, मैं जार के भीतर एक विधि बुला रहा हूँ। इस विधि के भीतर, मैं this.class.getResource(relPath) का उपयोग कर संसाधन प्राप्त कर रहा हूं, जबकि relPath मुझे आवश्यक फ़ाइल के लिए एक हार्डकोडेड सापेक्ष पथ है। यह मुझे URL देता है जिसका उपयोग मैं File बनाने के लिए कर सकता हूं।

अब, यह पूरी तरह से काम करता है अगर मैं इस विधि को प्लगइन से नहीं बुला रहा हूं, लेकिन एक साधारण जावा-प्रोग्राम से। अंतर: ग्रहण आरसीपी का क्लासलोडर प्रोटोकॉल bundleresource:// का URL देता है जो File द्वारा समर्थित नहीं है, जबकि एक साधारण जावा-प्रोग्राम चलाते समय, file:// -URL वापस लौटाया जाता है जो File बनाने के लिए पूरी तरह से ठीक है।

मुझे ग्रहण एसडीके (जो बंडलरसोर्स-यूआरएल फाइल-यूआरएल में हल करता है) के FileLocator -class के बारे में पता है, लेकिन मैं पुस्तकालय के भीतर इसका उपयोग नहीं कर सकता क्योंकि मैं इसे ग्रहण आरसीपी मंच से जोड़ना नहीं चाहता - यह गैर-ग्रहण-आरसीपी स्रोतों से भी इस lib का उपयोग करना संभव होना चाहिए।

कोई भी इस विचार को किसी रिश्तेदार पथ से कैसे लोड कर सकता है इस तरह से कोई विचार है कि जब दोनों ग्रहण ग्रहण आरसीपी-प्लगइन या किसी अन्य क्लाइंट से विधि को कॉल किया जाता है तो दोनों काम करेंगे?

मुझे फ़ाइलों के भीतर खोजने के लिए इस सापेक्ष पथ की निर्देशिका पर File बनाने की आवश्यकता है। मैं पूरी तरह से इस पर अटक कर रहा हूँ ...

अद्यतन: यदि कोई संभावना File#list() का उपयोग कर निर्देशिका सामग्री यह पहले से ही मेरी मदद करेंगे पाने के लिए अन्य की तुलना में .. है

बहुत सराहना किसी भी संकेत,

+0

आप प्रासंगिक कोड की सूची कर सकते हैं? –

+0

@TonnyMadsen एचएम, मैं मूल रूप से यह बहुत सरल हो सकता था: मैं इसका उपयोग कर रहा हूं .getClass()। GetResource (relPath) को मेरे क्लासपाथ में पथ लोड करने के लिए। यह मुझे एक बंडलरसोर्स देता है: // URL जब ग्रहण आरसीपी के तहत किया जाता है और एक फ़ाइल: // यूआरएल अन्यथा। फ़ाइल-ऑब्जेक्ट बनाने की कोशिश कर रहा है bundleresource: // URL के साथ विफल रहता है क्योंकि फ़ाइल इस प्रोटोकॉल का समर्थन नहीं करती है। चूंकि मुझे "relPath" की निर्देशिका सामग्री को पढ़ने की आवश्यकता है, इसलिए मुझे फ़ाइल का उपयोग करने के लिए मजबूर किया गया है ... – quaylar

+0

आप URL को फ़ाइल में कैसे परिवर्तित करते हैं? –

उत्तर

12

क्या आप केवल निर्भरता को उलटा नहीं कर सके। अर्थात।, अपने मॉड्यूल URL के रूप में संसाधन प्राप्त करने में कोई इंटरफ़ेस

interface Locator { URL resolve(URL url); } 

परिभाषित करता है और आप एक डिफ़ॉल्ट कार्यान्वयन

class StandaloneLocator implements Locator { 
    public URL resolve(URL url) { return url; } 
} 

उपयोग कर सकते हैं ग्रहण के मामले में, यह डिफ़ॉल्ट लोकेटर

class EclipseLocator implements Locator { 
    public URL resolve(URL url) { return FileLocator.resolve(url); } 
} 
द्वारा प्रतिस्थापित किया जा रहा है

अब, आपकी लाइब्रेरी में ग्रहण करने की कोई निर्भरता नहीं है, और आप अभी भी फ़ाइल लॉकर का उपयोग कर सकते हैं। चूंकि आपको कोई बंडलरसोर्स-यूआरएल w/o ग्रहण नहीं मिलेगा, इसलिए यह काम करना चाहिए।

चीयर्स, जेन्स

+0

मैंने जवाब देने से पहले ही समस्या को स्वयं ही रोक दिया है, लेकिन यह वास्तव में एक अच्छा विचार है! इसकी सराहना करें और अगली बार इसे फिर से प्रतिक्रिया दे सकता है :) – quaylar

0

Class से विधियों का उपयोग करके जार फ़ाइल में फ़ाइलों को गिनना संभव नहीं है। आपको या तो resourcelist फ़ाइल बनाने की आवश्यकता है जिसमें आपके सभी संसाधन नाम होंगे, या ज़िप संग्रह जैसे खुली जार फ़ाइल और ज़िप संग्रह जैसे फाइलों की गणना करें। File कक्षा file:// के अलावा प्रोटोकॉल को संभाल नहीं सकती है। यदि आपका रिसोर्स जार फ़ाइल में है, तो आपको Url कक्षा का उपयोग करना चाहिए और फ़ाइल सामग्री प्राप्त करने के लिए Url.openSteram विधि का उपयोग करके स्ट्रीम प्राप्त करना चाहिए।

यूपीडी सरल जावा एप्लिकेशन चलाने के संबंध में: आप शायद इसे जार फ़ाइल में पैक नहीं करते हैं, इसलिए आपकी कक्षाएं और संसाधन फाइल सिस्टम में रखे जाते हैं और संग्रह में नहीं होते हैं। यही कारण है कि आप file:// प्रोटोकॉल प्राप्त करते हैं। यदि आप जार फ़ाइल में पैक करते हैं, तो प्रोटोकॉल file:// नहीं होगा, यह jar:// होगा (सटीक प्रोटोकॉल नाम के बारे में निश्चित नहीं है)।

+0

अपने उत्तर की सराहना करते हैं, लेकिन फ़ाइल/संसाधन एक जार में नहीं है, लेकिन आवेदन के क्लासपाथ के भीतर एक डीआईआर में है। Url.openStream() के बारे में चिंता: दुर्भाग्यवश दुर्भाग्यवश इस विधि का उपयोग कर निर्देशिका-सामग्री को पढ़ने के लिए संभव नहीं है (मुझे संसाधन के रूप में निर्देशिका लोड करने और मौजूदा फ़ाइलों की जांच करने की आवश्यकता है)। – quaylar