类加载器资源路径总是绝对的?

时间:2015-08-25 23:23:44

标签: java classloader

在流行的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()

1 个答案:

答案 0 :(得分:1)

显然不是。

由类加载器解释name中的getResource(name)

检查URLClassLoader的源代码,最终调用

new URL(baseURL, name)

这里重要的是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