我从Class.getResource()和ClassLoader.getResource()之间有什么区别? 从自己的代码
getClass().getResource("/path/image.png")
等同于
getClass().getClassLoader().getResource("path/image.png")
无法读取jar文件中的图像的帖子显示了使用
在可执行jar文件中返回null,而
返回正确的URL。
SinceClass.getResource()``ClassLoader.getResource()删除前导斜杠后的代表,我希望这些调用是相同的,但显然在这种情况下它们是不同的。即使将特殊的类加载器附加到特定的类上,对于每次调用,它也应该是相同的,再次导致相同的行为。
SinceClass.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()搜索,而相对于classpath根目录进行 搜索。
getClass().getResource()
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
如果那 不是 您得到的输出…我感到困惑。
无论值多少,我都在跑步:
Eclipse Indigo(没关系)
在IDE内部运行(在IDE内部还是外部都无关紧要是文件系统还是.jar)
我的JRE是1.6(如果有的话,这可能是个大问题)
抱歉,我们无法解决我 认为 很简单的问题:(
附录11/21/12(安德烈亚斯):
由于没有关于此问题的近期活动,所以我想总结一下我们发现的结果:
Class.getResource("/path/image.png")
ClassLoader.getResource("path/image.png")