乔恩·斯基特(Jon Skeet)在关于类加载方法之间差异的流行answer中指出:
更加流行的answer举例说明了这一说法。
忽略示例无法编译的事实,共识表明领先的斜杠与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()。
最佳答案
显然不是。
由类加载器决定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/