read - java resource path



Class.getResource()和ClassLoader.getResource()在可執行jar中的奇怪行為 (1)

我理解Class.getResource()和ClassLoader.getResource()之間有什麼區別? 從自己的代碼,那

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

是完全相同的

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

發布無法讀取jar文件中的圖像顯示使用中的問題

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

在可執行jar文件中返回null,而

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

返回正確的URL。

Since Class.getResource()在刪除前導斜杠後委託給ClassLoader.getResource() ,我希望這些調用是相同的,但顯然它們不是這種情況。 即使特殊類加載器附加到特定類,每次調用它仍然應該是相同的,再次導致相同的行為。

所以,問題是: 是否存在以下代碼在第一次調用時返回null但第二次調用的正確URL的明顯情況?

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();
   }
}

我以為這個問題已經被問到並回答了!

getClass().getResource()相對於.class文件進行搜索,而getClass().getClassLoader().getResource()相對於類路徑根搜索。

如果這裡有SSCCE,我不明白為什麼不這樣做

1)在.jar中顯示目錄組織,並...

2)考慮包裝

問: Class.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");
    }
}

這是相應的目錄樹。 它碰巧是一個Eclipse項目,但無論是Eclipse,Netbeans還是.jar文件,目錄都是一樣的:

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

正在打開的文件是“subdir / readme.txt”

ADDENDUM 11/9/12:

嗨 -

我從github逐字複製你的代碼,重新編譯並重新運行:

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

如果這不是你得到的輸出......我很困惑。

不管它有什麼價值,我都在運行:

  • Eclipse Indigo(應該沒關係)

  • 在IDE內部運行(無論是文件系統還是.jar,在IDE內部或外部都無關緊要)

  • 我的JRE是1.6(如果有的話,這可能是個大問題)

抱歉,我們無法解決我認為是一個簡單的問題:(

ADDENDUM 11/21/12(Andreas):

由於此問題最近沒有活動,我想總結一下我們發現的內容:

  • 根據我們的共同理解,上述問題的答案是: “不, Class.getResource("/path/image.png")返回有效的URL,而ClassLoader.getResource("path/image.png")返回null”
    • 我們完全清楚ClassLoader.getResource()和Class.getResource()之間的區別
    • 我們的樣本輸出匹配“SUCCESS”和“null”
    • 樣本輸出符合我們的預期
    • 結論:要么我們監督某些事情,要么不同的事情導致鏈接問題中描述的“解決方案”起作用。 我想我們目前無法證明這一個或另一個。




executable-jar