下面均假设资源文件均在main
目录下面的resources
里面:
在 Java SE 中,如果使用ClassLoader.getResource
获取资源(包括ClassLoader.getResourceAsStream
,下面不再重复),其路径不能以"/"开头。换言之,如果有个foo.txt
的话,代码
getClass().getClassLoader().getResource("/foo.txt")
将返回null
。
但是我发现,如果在 Java EE 项目中,同样的情况,加不加"/"均能正常获取资源文件,这是为什么?
1
xiaopanzi OP 隐约找到了一个很可能的[解释]( https://stackoverflow.com/questions/2653322/getresourceasstream-not-loading-resource-in-webapp#comment5040719_2653353):大体的意思是 Tomcat 8 及之后,`WebAppClassloader` 能够同时处理带或者不带“/”的路径;而在 Tomcat 7 之前,仅能处理不带“/”的路径。显然,JDK 本身的`Classloader`还是只能处理不带“/”的路径。
但是对 Java EE 中这个`WebAppClassloader`相关类加载的东西还不是很懂,也没见到靠谱资料,是否有懂行的大佬推荐点相关资料? |
2
israinbow 2021-05-23 22:25:09 +08:00
ide 的项目结构配置问题
|
3
xiaopanzi OP @israinbow 能具体解释吗?我上面找到那个新版本 Tomcat 能够处理带“/”的路径的解释有问题吗?我也只是看到那个答案,不清楚具体情况?
|
4
israinbow 2021-05-23 23:18:37 +08:00
@xiaopanzi 以前在 idea 里遇见过一次, 印象里是 javaEE 的项目结构配置把路径映射了.tomcat 的解释是正确的, 使用 tomcat 会认定你的 java/src 目录是服务器里的某一个位置, 而不是 java 源代码的资源位置, tomcat7 和 8 的区别可以在更新日志里查到. 目前我个人对路径问题的解决方案: 转义符, 或首目录不加 / ,比如 "test/subtest/file.file". 参考文章: blog.csdn.net/aitangyong/article/details/36471881 以及
blog.csdn.net/mycomputerxiaomei/article/details/24472023 |
5
ikas 2021-05-23 23:20:04 +08:00
这个就是 tomcat 自己实现问题.你应该按照正常得写法,不带 /,具体你可以看 tomcat 源码,在 9 中,他内部实现: private String nameToPath(String name) {
if (name.startsWith("/")) { return name; } StringBuilder path = new StringBuilder( 1 + name.length()); path.append('/'); path.append(name); return path.toString(); } |