乔恩·斯基特(Jon Skeet)在关于类加载方法之间差异的流行answer中指出:



更加流行的answer举例说明了这一说法。



忽略示例无法编译的事实,共识表明领先的斜杠与ClassLoader无关。

一个简单的测试则相反。
Foo.class.getClassLoader().getResource("test.xml") // fileFoo.class.getClassLoader().getResource("/test.xml") // null
我只是将路径files/test.xml添加到了测试项目的类路径中,名为Foo的类包含了main()方法,可打印出这两个调用的结果。自数百人投票赞成上述答案以来,我想念的是什么? ClassLoader是绝对的,还是取决于输入名称的结构?

这个Oracle blog post对我的理解很有帮助。

最终根据资源名称构造URL的方法是URLClassPath.JarLoader.checkResource()

最佳答案

显然不是。

由类加载器决定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

关于java - 类加载器的资源路径总是绝对的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32215693/

10-09 09:48