You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java项目中子目录下的类无法加载资源文件的原因咨询

资源加载失败的原因与解决方案

原因分析

getClass().getResource(String path)的路径解析规则是问题核心:

  • 如果路径不带开头斜杠,JVM会以当前类所在的包路径为基准,拼接路径后查找资源。
  • 如果路径带开头斜杠,则直接从类路径的根目录开始查找。

结合你的项目结构来看:

  • File1位于com.example.app包,调用getResource("Views/View1.fxml")时,实际查找的是类路径下的com/example/app/Views/View1.fxml(这也是你能成功加载的原因)。
  • File2位于com.example.app.subdirectory包,同样调用getResource("Views/View1.fxml")时,JVM会去查找com/example/app/subdirectory/Views/View1.fxml,而你的资源实际在com/example/views/目录下,自然无法定位到。

解决方案

推荐以下两种通用且健壮的方式,避免包结构变化影响资源加载:

  1. 使用绝对路径(带开头斜杠)
    直接从类路径根目录指定资源的完整路径,不受当前类所在包的限制:
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/com/example/views/View1.fxml"));
  1. 通过ClassLoader加载
    ClassLoader.getResource()的路径默认从类路径根开始,不需要添加开头斜杠:
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getClassLoader().getResource("com/example/views/View1.fxml"));

如果一定要使用相对路径(不推荐,包结构变动时需同步修改路径),可以在File2中通过上级目录跳转定位资源:

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../views/View1.fxml"));

内容的提问来源于stack exchange,提问作者Carlosz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:34:51