java - निष्पादन योग्य जार में Class.getResource() और ClassLoader.getResource() का अजीब व्यवहार



embedded-resource executable-jar (1)

मैंने सोचा कि यह सवाल पहले से ही पूछा गया था और उत्तर दिया!

getClass().getResource() getClass().getClassLoader().getResource() प्राप्त करें। क्लासपाथ रूट के सापेक्ष खोज प्राप्त करें।

अगर यहां एक एसएससीसीई है, तो मुझे समझ में नहीं आता कि यह क्यों नहीं करता है

1) .jar में निर्देशिका संगठन दिखाएं, और ...

2) पैकेज को ध्यान में रखें

प्रश्न: क्लास.getResource () और ClassLoader.getResource () के बीच क्या अंतर है (क्या कुछ भी) का पहले से ही उत्तर नहीं दिया गया है ? (और लिंक यह उद्धृत करता है)?

================================================== =======================

मुझे अभी भी यकीन नहीं है कि क्या स्पष्ट नहीं है, लेकिन यह उदाहरण मदद कर सकता है:

/*
  SAMPLE OUTPUT:
  ClassLoader.getResource(/subdir/readme.txt): NULL
  Class.getResource(/subdir/readme.txt): SUCCESS

  ClassLoader.getResource(subdir/readme.txt): SUCCESS
  Class.getResource(subdir/readme.txt): NULL
 */
package com.so.resourcetest;

import java.net.URL;

public class ResourceTest {

    public static void main(String[] args) {
        ResourceTest app = new ResourceTest ();
    }

    public ResourceTest () {
        doClassLoaderGetResource ("/subdir/readme.txt");
        doClassGetResource ("/subdir/readme.txt");
        doClassLoaderGetResource ("subdir/readme.txt");
        doClassGetResource ("subdir/readme.txt");
    }

    private void doClassLoaderGetResource (String sPath) {
        URL url  = getClass().getClassLoader().getResource(sPath);
        if (url == null)
            System.out.println("ClassLoader.getResource(" + sPath + "): NULL");
        else
            System.out.println("ClassLoader.getResource(" + sPath + "): SUCCESS");
    }

    private void doClassGetResource (String sPath) {
        URL url  = getClass().getResource(sPath);
        if (url == null)
            System.out.println("Class.getResource(" + sPath + "): NULL");
        else
            System.out.println("Class.getResource(" + sPath + "): SUCCESS");
    }
}

यहां संबंधित निर्देशिका पेड़ है। यह ग्रहण प्रोजेक्ट होता है, लेकिन निर्देशिकाएं समान हैं, भले ही यह ग्रहण, नेटबीन ... या एक .jar फ़ाइल है:

C:.
├───.settings
├───bin
│   ├───com
│   │   └───so
│   │       └───resourcetest
│   └───subdir
└───src
    ├───com
    │   └───so
    │       └───resourcetest
    └───subdir

खोला जा रहा फ़ाइल "subdir / readme.txt" है

अतिरिक्त 11/9/12:

नमस्ते -

मैंने आपके कोड वर्बैटिम को जिथब से कॉपी किया, फिर से संकलित और पुनः चलाया:

ClassLoader.getResource(/subdir/readme.txt): NULL
Class.getResource(/subdir/readme.txt): SUCCESS
ClassLoader.getResource(subdir/readme.txt): SUCCESS
Class.getResource(subdir/readme.txt): NULL

यदि वह आउटपुट नहीं है जो आपको मिल रहा है ... मैं परेशान हूं।

जो कुछ भी लायक है, मैं दौड़ रहा हूं:

  • ग्रहण इंडिगो (इससे कोई फर्क नहीं पड़ता)

  • आईडीई के अंदर चल रहा है (इससे कोई फर्क नहीं पड़ता कि यह फाइल सिस्टम या .jar है, आईडीई के अंदर या बाहर)

  • मेरा जेआरई 1.6 है (यदि कुछ भी हो, तो शायद यह बड़ी बात है)

क्षमा करें, जो मैंने सोचा था वह हल करने में सक्षम नहीं है :(

अतिरिक्त 11/21/12 (एंड्रियास):

चूंकि इस प्रश्न पर कोई हालिया गतिविधि नहीं थी, इसलिए हम जो कुछ मिला उसे सारांशित करना चाहते हैं:

  • हमारी सामान्य समझ से, उपरोक्त प्रश्न का उत्तर यह है: "नहीं, यह संभव नहीं है कि Class.getResource("/path/image.png") एक मान्य यूआरएल देता है, जबकि ClassLoader.getResource("path/image.png") शून्य वापस आता है" :
    • हम ClassLoader.getResource () और Class.getResource () के बीच के अंतर पर पूरी तरह स्पष्ट हैं
    • हमारा नमूना आउटपुट "सफलता" और "शून्य" दोनों के लिए मेल खाता है
    • नमूना आउटपुट जो हम उम्मीद करेंगे उससे मेल खाते हैं
    • निष्कर्ष: या तो हमने कुछ भी देखा, या कुछ अलग-अलग कारणों से जुड़े समाधान में "समाधान" का कारण बन गया। मुझे लगता है कि हम वर्तमान में एक या दूसरे को साबित नहीं कर सकते हैं।

मैं समझता हूं कि Class.getResource () और ClassLoader.getResource () के बीच क्या अंतर है? और अपने कोड से, वह

getClass().getResource("/path/image.png")

के समान है

getClass().getClassLoader().getResource("path/image.png")

पोस्टिंग जार फ़ाइल में एक छवि नहीं पढ़ी जा सकती है जहां एक समस्या है

getClass().getClassLoader().getResource("path/image.png")

एक निष्पादन योग्य जार फ़ाइल में, शून्य, जबकि वापस आता है

getClass().getResource("/path/image.png")

सही यूआरएल देता है।

Since Class.getResource() ClassLoader.getResource() को अग्रणी स्लैश हटाने के बाद प्रतिनिधियों के बाद, मैं उम्मीद करता हूं कि ये कॉल समान हैं, लेकिन जाहिर है कि वे इस मामले में नहीं हैं। यहां तक ​​कि जब एक विशेष वर्ग लोडर को विशेष वर्ग से जोड़ा जाता है, तब भी यह प्रत्येक कॉल के लिए एक जैसा होना चाहिए, जिसके परिणामस्वरूप एक ही व्यवहार होता है।

तो, सवाल यह है: क्या कोई स्पष्ट परिस्थितियां हैं जिसके अंतर्गत निम्नलिखित कॉल पहली कॉल के लिए शून्य है लेकिन दूसरी कॉल के लिए उचित यूआरएल है?

package com.example;

import java.net.URL;

public class ResourceTest {

   public void run() {
      URL iconUrl1 = getClass().getClassLoader().getResource("path/image.png");
      System.out.println("ClassLoader.getResource(\"path/image.png\"): " + iconUrl1);

      URL iconUrl2 = getClass().getResource("/path/image.png");
      System.out.println("Class.getResource(\"/path/image.png\"): " + iconUrl2);
   }

   public static void main(String[] args) {
      ResourceTest app = new ResourceTest();
      app.run();
   }
}




executable-jar