在流行的answer中关于类加载方法之间的区别,Jon Skeet表示,
类加载器资源路径始终被视为绝对路径。
更受欢迎的answer以一个例子肯定了这句话。
ClassLoader.getResourceAsStream(path)
会考虑所有路径 绝对路径。所以打电话String.getClassLoader().getResourceAsString("myfile.txt")
和String.getClassLoader().getResourceAsString("/myfile.txt")
两者都将 在以下位置的类路径中查找文件:./myfile.txt
。
忽略该示例不会编译的事实,共识表明前导斜杠与ClassLoader无关。
一个简单的测试显示不然。
Foo.class.getClassLoader().getResource("test.xml") // file
Foo.class.getClassLoader().getResource("/test.xml") // null
我只是将路径files/test.xml
添加到测试项目的类路径中,其中一个名为Foo
的类包含main()
方法,打印出这两个调用的结果。我错过了什么,因为数百人已经投了上述答案? ClassLoader是绝对的,还是取决于输入名称的结构?
这Oracle blog post对我的理解很有帮助。
最终根据资源名称构建URL的方法是URLClassPath.JarLoader.checkResource()。
答案 0 :(得分:1)
显然不是。
由类加载器解释name
中的getResource(name)
。
检查URLClassLoader
的源代码,最终调用
这里重要的是name
是绝对的还是相对的
对于某些baseURL
,绝对/foo/bar
和相对foo/bar
可能会产生相同的效果。特别是,类路径中的"jar file URL"总是如此
baseURL: jar:file:/home/duke/duke.jar!/
foo/bar -> jar:file:/home/duke/duke.jar!/foo/bar
/foo/bar -> jar:file:/home/duke/duke.jar!/foo/bar