2011-03-04 18 views
68

मैं अपने क्लासपाथ से रिकर्सिव संसाधन खोजने के लिए ClassLoader.getResources() का उपयोग कैसे कर सकता हूं?क्लासलोडर.getResources() का सही उपयोग कैसे करें?

उदा।

  • META-INF "निर्देशिका" में सभी संसाधनों की खोज: कल्पना कीजिए कुछ

    तरह

    getClass().getClassLoader().getResources("META-INF")

    दुर्भाग्य से, यह केवल एक URL लिए वास्तव में इस "निर्देशिका" पुनः प्राप्त करता है।

  • सभी संसाधनों bla.xml (recursivly) नाम दिया

    getClass().getClassLoader().getResources("bla.xml")

    लेकिन यह एक खाली Enumeration देता है।

और एक बोनस के रूप में प्रश्न: कैसे ClassLoader.getResources()ClassLoader.getResource() से भिन्न होता है?

+12

@Andrew, चौखटे की एक बहुत कुछ के लिए पुनरावृति कुछ प्रक्रियाओं को स्वचालित करने के लिए अभिलेखागार में नाम या एक्सटेंशन के आधार पर कुछ फ़ाइलें, जैसे स्ट्रिप के एक्शनबीन्स ढूंढना, या hibm.xml फ़ाइलों को हाइबरनेट के लिए। – bestsss

+2

देखें http://stackoverflow.com/questions/1429172/how-do-i-list-the-files-inside-a-jar-file/ – Vadzim

+0

रेज़न क्यों आपको भ्रमित करता है कि getResources क्लास लोडर पर काम करता है जो कक्षा में कई JAR हो सकता है। तो यदि आपके पास एक ही संसाधन के साथ कई JARs हैं, तो आप सभी को प्राप्त करें। हालांकि यह निर्देशिकाओं के अंदर खोजना नहीं है। GetResources ("मेटा-आईएनएफ") के साथ आपको सीएल के खोज पथ में सभी मेटा-आईएनएफओ निर्देशिकाएं मिलती हैं और यदि सीएल एक सिंगल जार फ़ाइल क्लास लोडर है, तो आपको सबसे ज्यादा एक प्रविष्टि मिलती है। – eckes

उत्तर

18

क्लासपाथ के माध्यम से पुनरावर्ती रूप से खोजने का कोई तरीका नहीं है। इस तरह से इसे पुनर्प्राप्त करने में सक्षम होने के लिए आपको संसाधन के पूर्ण पथनाम को जानने की आवश्यकता है। संसाधन फ़ाइल सिस्टम में या एक जार फ़ाइल में निर्देशिका में हो सकता है, इसलिए यह "क्लासपाथ" की निर्देशिका सूची करने के समान आसान नहीं है। आपको संसाधन का पूरा मार्ग प्रदान करना होगा उदा। '/com/mypath/bla.xml'।

अपने दूसरे प्रश्न के लिए, GetResource पहले संसाधन को वापस कर देगा जो दिए गए संसाधन नाम से मेल खाता है। कक्षा पथ की खोज की गई ऑर्डर the javadoc for getResource.

+11

* कक्षा के माध्यम से पुनः खोज करने का कोई तरीका नहीं है * ... निश्चित रूप से, यह संभव है। उदाहरण के लिए: 'URLClassLoader.getURLs() '। जारफाइल खोलें, इसके माध्यम से फिर से शुरू करें। – bestsss

+3

@bestsss: क्या होगा यदि यूआरएल एक जारफाइल को इंगित नहीं करता है, लेकिन निर्देशिका में? – MRalwasser

+6

@bestsss, @MRalwasser: या इससे भी बदतर, यदि यह एक HTTP यूआरएल को इंगित करता है? –

5

एमआरएलवास्कर, मैं आपको एक संकेत देता हूं, URL.getConnection() से JarURLConnection पर डाला गया है। फिर JarURLConnection.getJarFile() और voila का उपयोग करें! आपके पास जारफाइल है और आप अंदर संसाधनों तक पहुंचने के लिए स्वतंत्र हैं।

बाकी मैं आपको छोड़ देता हूं।

आशा है कि इससे मदद मिलती है! ,

File file=new File(url.toURI()); 

अब आप अपने ठोस प्रश्नों के लिए:

+0

'URL.getConnection()' से आपका क्या मतलब है? मुझे वैसे भी यह विधि नहीं मिल रही है। – m0skit0

15

यह सबसे सरल वाट फ़ाइल वस्तु जो करने के लिए एक निश्चित यूआरएल ऑब्जेक्ट पर इंगित कर रहा है पाने के लिए है

  • में सभी संसाधनों की खोज मेटा-आईएनएफ "निर्देशिका":

आप इंडी एड

Enumeration<URL> en=getClass().getClassLoader().getResources("META-INF"); 
if (en.hasMoreElements()) { 
    URL metaInf=en.nextElement(); 
    File fileMetaInf=new File(metaInf.toURI()); 

    File[] files=fileMetaInf.listFiles(); 
    //or 
    String[] filenames=fileMetaInf.list(); 
} 
  • सभी bla नामित संसाधनों को इस URL पर फ़ाइल वस्तु की ओर इशारा करते मिलता है।एक्सएमएल (recursivly)

इस मामले में, आप कुछ कस्टम कोड करना होगा।

final List<File> foundFiles=new ArrayList<File>(); 

FileFilter customFilter=new FileFilter() { 
    @Override 
    public boolean accept(File pathname) { 

     if(pathname.isDirectory()) { 
      pathname.listFiles(this); 
     } 
     if(pathname.getName().endsWith("bla.xml")) { 
      foundFiles.add(pathname); 
      return true; 
     } 
     return false; 
    } 

};  
//rootFolder here represents a File Object pointing the root forlder of your search 
rootFolder.listFiles(customFilter); 

जब कोड चलता है, आप foundFiles सूची बिल्कुल पाया आवृत्तियों मिल जाएगा: यहाँ एक डमी उदाहरण है।

Enumeration<URL> en = getClass().getClassLoader().getResources(
      "META-INF"); 
    List<String> profiles = new ArrayList<>(); 
    if (en.hasMoreElements()) { 
     URL url = en.nextElement(); 
     JarURLConnection urlcon = (JarURLConnection) (url.openConnection()); 
     try (JarFile jar = urlcon.getJarFile();) { 
      Enumeration<JarEntry> entries = jar.entries(); 
      while (entries.hasMoreElements()) { 
       String entry = entries.nextElement().getName(); 
       System.out.println(entry); 
      } 
     } 
    } 
+9

मुझे संदेह है कि यह हर प्रकार के क्लासलोडर्स (जैसे जार-फाइलों के भीतर कक्षाओं) के लिए किसी भी मामले में काम करेगा – MRalwasser

+23

मैंने परीक्षण किया, मुझे अपवाद मिला: java.lang.IllegalArgumentException: यूआरआई पदानुक्रमित नहीं है। आप एक अपारदर्शी यूआरआई से फ़ाइल ऑब्जेक्ट नहीं बना सकते जैसे "जार: ..." – cn1h

9

यहाँ bestsss 'उत्तर के आधार पर कोड है

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); 
resolver.getResources("classpath*:some/package/name/**/*.xml"); 
+2

इस तरह की संरचना ने मुझे पहले भ्रमित कर दिया। ऐसा लगता है कि getClass()। GetClassLoader()। GetResources ("मेटा-आईएनएफ") का एकमात्र उद्देश्य जार में कुछ मनमानी फ़ाइल का संदर्भ प्राप्त करना है, जिसे हम तब JarURLConnection प्राप्त करने के लिए उपयोग करते हैं। मैंने मूल रूप से सोचा था कि यह मेटा-आईएनएफ निर्देशिका में फ़ाइलों पर फिर से शुरू होगा, लेकिन यह वास्तव में पूरे जार में प्रत्येक फ़ाइल पर पुनरावृत्त करता है। –

+0

यह मेरे लिए काम नहीं करता है। यह केवल कक्षा पथ में पहली जार फ़ाइल 'जे' की सामग्री दिखाता है, जैसे कि' जे 'में एक प्रविष्टि होती है जो 'स्रोत स्रोत (पथ)' विधि को दिए गए 'पथ' से शुरू होती है। तो, आपके कोड स्निपेट का नतीजा अधूरा है और कक्षा पथ में तत्वों के क्रम पर निर्भर करता है। तो, @krock सही था जब उसने कहा कि _There क्लासपाथ_ – Readren

31

स्प्रिंग फ्रेमवर्क एक वर्ग जो रिकर्सिवली classpath के माध्यम से खोज करने के लिए अनुमति देता है:

+0

के माध्यम से पुनरावर्ती रूप से खोज करने का कोई तरीका नहीं है यदि आप एक जार के भीतर संसाधनों को हल करने का प्रयास कर रहे हैं, और आप सुनिश्चित नहीं हैं कि पैटर्न कैसा दिखना चाहिए, तो 'jar tf' myjar.jar'। मैं 'PathMatchinResourcePatternResolver (" परिभाषाओं/**/*। जेसन ") के साथ समाप्त हुआ। – MatrixManAtYrService

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