Class.getResource()和ClassLoader.getResource()在可执行jar中的奇怪行为

And*_*ter 34 java executable-jar classloader embedded-resource

我理解Class.getResource()和ClassLoader.getResource()之间有什么区别? 从自己的代码,那

getClass().getResource("/path/image.png")
Run Code Online (Sandbox Code Playgroud)

是完全相同的

getClass().getClassLoader().getResource("path/image.png")
Run Code Online (Sandbox Code Playgroud)

发布无法读取jar文件中的图像显示使用的问题

getClass().getClassLoader().getResource("path/image.png")
Run Code Online (Sandbox Code Playgroud)

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

getClass().getResource("/path/image.png")
Run Code Online (Sandbox Code Playgroud)

返回正确的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();
   }
}
Run Code Online (Sandbox Code Playgroud)

pau*_*sm4 39

我以为这个问题已经被问到并回答了!

getClass().getResource()getClass().getClassLoader().getResource()相对于类路径根搜索时,相对于.class文件进行 搜索.

如果这里有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");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是相应的目录树.它恰好是一个Eclipse项目,但无论是Eclipse,Netbeans还是.jar文件,目录都是相同的:

C:.
????.settings
????bin
?   ????com
?   ?   ????so
?   ?       ????resourcetest
?   ????subdir
????src
    ????com
    ?   ????so
    ?       ????resourcetest
    ????subdir
Run Code Online (Sandbox Code Playgroud)

正在打开的文件是"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
Run Code Online (Sandbox Code Playgroud)

如果这不是你得到的输出......我很困惑.

无论它值多少,我都在跑:

  • 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"
    • 样本输出符合我们的预期
    • 结论:要么我们监督某些东西,要么是不同的东西导致链接问题中描述的"解决方案"起作用.我想我们目前无法证明这一个或另一个.