我要问一个似乎与许多现有问题重复的问题,但我找到的答案似乎都不能为我解决问题。
考虑以下课程:
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"));
}
}
以及仅包含三个文件的目标目录结构:
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。该行为与项目是否模块化无关。 这个问题(以及其他问题)的答案表明上述内容应该有效,但事实并非如此。我忽略了什么?
问题是你的前缀斜杠:
System.out.println(ClassLoader.getSystemResource("/sub/nested.txt"));
⬆︎
这告诉类加载器查找相对于文件系统根目录的资源,而不是相对于它认为的“基本”目录(即,您的系统资源目录,在文件系统或 jar 中)。
删除它,它应该可以工作:
System.out.println(ClassLoader.getSystemResource("sub/nested.txt"));