我以为这个问题已经被问到并回答了!
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”
增编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
如果这不是您获得的输出...我很困惑。
无论它的价值如何,我都在运行:
很抱歉,我们无法解决我认为是一个简单的问题:(
增编11/21/12(安德烈亚斯):
由于最近没有关于这个问题的活动,我想总结一下我们的发现:
- 根据我们的共同理解,上述问题的答案是:“不,
Class.getResource(”/path/image.png“)
不可能返回有效的URL,而ClassLoader.getResource(”path/image.png“)
返回null”:
- 我们完全清楚ClassLoader.getResource()和Class.getResource()之间的区别。
- 我们的样本输出匹配,用于“成功”和“空”
- 示例输出符合我们的预期
- 结论:要么我们监督了一些东西,要么不同的东西导致了链接问题中描述的“解决方案”起作用。我认为我们目前无法证明其中一个。