我要问一个似乎与许多现有问题重复的问题,但我找到的答案似乎都不能为我解决问题。
考虑以下课程:
package resources;
public class Main {
public static void main(String[] args) {
System.out.println(ClassLoader.getSystemResource("toplevel.txt"));
System.out.println(ClassLoader.getSystemResource("/sub/nested.txt"));
}
}
在带有
module-info
的模块化项目中:
module resources {
exports resources;
}
以及仅包含三个文件的目标目录结构:
resources/Main.class
sub/nested.txt
toplevel.txt
输出为:
file:/C:/Eclipse/workspace-2023-03/resources/bin/toplevel.txt
null
显然路径
/C:/Eclipse/workspace-2023-03/resources/bin/
是我的目标目录的路径。为什么找不到资源/sub/nested.txt
?
我在 Eclipse 中使用 JDK 17。 这个问题(以及其他问题)的答案表明上述内容应该有效,但事实并非如此。我忽略了什么?
编辑:原来的问题没有具体指模块化项目。 @yshavit 的答案对于非模块化答案是正确的,但对于模块化答案则不然。
问题是你的前缀斜杠:
System.out.println(ClassLoader.getSystemResource("/sub/nested.txt"));
⬆︎
Java 对系统资源的处理可能会令人困惑,特别是在前缀斜杠方面。但是,请注意,您在正在运行的
getSystemResource
呼叫中没有它。
删除它,它应该可以工作:
System.out.println(ClassLoader.getSystemResource("sub/nested.txt"));