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)
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":