在Intellij IDEA中,我试图在我的Maven JavaFX模块化项目中加载资源。
以下是我的项目结构:
myProject
- src
- main
- java
- com
- example
- myPackage
- myApp.java
- module-info.java
- resources
- fonts
- font.ttf
- font.ttf
字符串
我复制了我试图在resources
中加载的字体,以测试以下内容:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL rootFile = loader.getResource("font.ttf"); // this works
URL subfolderFile = loader.getResource("fonts/font.ttf"); // this does not work
System.out.println(rootFile); // file:/C:/Users/... stuff .../myProject/target/classes/font.ttf
System.out.println(subfolderFile); // null, was expecting file:/C:/Users/... stuff .../myProject/target/classes/fonts/font.ttf
型
我找不到任何帖子回答我的问题。有人能解释一下吗?
1条答案
按热度按时间fnatzsnv1#
注意
ClassLoader#getResource(String)
的文档:命名模块中的资源受
Module.getResourceAsStream
指定的封装规则约束。此外,除了资源名称以“.class”结尾的特殊情况外,**此方法仅在无条件打开包时查找命名模块的包中的资源 [强调已添加](即使此方法的调用者与资源在同一模块中)你有一个
module-info.java
文件,所以你的代码在一个命名的模块中。fonts/font.ttf
资源在fonts
包中,所以它是封装的。而font.tff
资源在模块的根,这意味着它不在包中,因此它是 * 未 * 封装的。如果您添加:
字符串
到您的
module-info.java
文件,然后您应该能够通过ClassLoader
加载fonts/font.ttf
。也就是说,使用
Class#getResource(String)
通常更简单,特别是当调用者、类和资源都在同一个模块中时。