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

JavaFX 16存在module-info.java时无法访问resources资源文件求助

根本原因

Java 9及以上版本引入的JPMS(Java平台模块系统)对模块内的资源访问做了封装限制,默认情况下模块内resources目录下的非类文件资源无法被类加载器直接读取,这就是你保留module-info.java时资源加载失败、删除后恢复正常的核心原因。


解决方案步骤

步骤1:修改module-info.java配置

在现有配置基础上添加资源目录的开放声明,示例配置如下:

module com.simtechdata.test {
    requires javafx.controls;
    requires javafx.fxml;

    opens com.simtechdata.test to javafx.fxml;
    // 开放resources下的资源目录,允许类加载器读取对应目录下的资源
    opens StyleSheets;
    opens Images;
    // 若要一次性开放所有根目录下的资源,可直接添加下方配置
    // opens "";

    exports com.simtechdata.test;
}

步骤2:统一资源读取路径写法

不同的资源读取API对路径的解析规则不同,请注意区分:

  • 用ClassLoader.getResource/getResourceAsStream时,路径直接写相对于resources根目录的路径,示例:
    // 写法正确
    classLoader.getResource("StyleSheets/AnchorPane.css");
    
  • 用类对象.getResource/getResourceAsStream时,路径开头需加/才表示从resources根目录查找,不加则默认从当前类的包路径下查找,示例:
    // 错误写法:从当前类的包路径下查找StyleSheets目录
    this.getClass().getResource("StyleSheets/AnchorPane.css");
    // 正确写法:从resources根目录查找
    this.getClass().getResource("/StyleSheets/AnchorPane.css");
    

可选优化建议

你测试代码中把资源URL转成File对象的写法仅适用于开发阶段未打包的场景,项目打包为jar包后,资源文件会嵌套在jar包内部,无法通过File类直接读取,建议统一使用getResourceAsStream读取资源内容,适配所有运行场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:15:01