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



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

我以为这个问题已经被问过了!

Class.getResource()
  • 和 Class.getResource() 有什么区别 ClassLoader.getResource()?

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还是Netbeans,目录都是相同的。或.jar文件:

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

正在打开的文件是"子目录/自述文件.txt">


附录 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

如果这不是您获得的输出...我很困惑。

无论它的价值如何,我都在运行:

  • 日食靛蓝(没关系)

  • 在 IDE 内部运行(无论是文件系统还是.jar,在 IDE 内部还是外部都无关紧要)

  • 我的 JRE 是 1.6(如果有的话,这可能是最大的)

抱歉,我们无法解决我认为是一个简单的问题:(

附录11/

21/12(安德烈亚斯):

由于最近没有关于这个问题的活动,我想总结一下我们的发现:

  • 根据我们的共识,上述问题的答案是:">不,Class.getResource("/path/image.png")不可能返回有效的 URL,而ClassLoader.getResource("path/image.png")返回 null">
    • 我们完全清楚 ClassLoader.getResource() 和 Class.getResource() 之间的区别
    • 我们的示例输出匹配,对于"成功"和"空">
    • 示例输出符合我们的预期
    • 结论:要么我们监督了某些事情,要么是不同的事情导致链接问题中描述的"解决方案"起作用。我认为我们目前无法证明其中之一。

相关内容

最新更新