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
相关产品推荐
相关产品推荐

