maven ClassLoader.getResource(“file”)可以工作,但ClassLoader.getResource(“folder/file”)不能

js4nwp54  于 2023-11-17  发布在  Maven
关注(0)|答案(1)|浏览(198)

在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


我找不到任何帖子回答我的问题。有人能解释一下吗?

fnatzsnv

fnatzsnv1#

注意ClassLoader#getResource(String)的文档:
命名模块中的资源受Module.getResourceAsStream指定的封装规则约束。此外,除了资源名称以“.class”结尾的特殊情况外,**此方法仅在无条件打开包时查找命名模块的包中的资源 [强调已添加](即使此方法的调用者与资源在同一模块中)
你有一个module-info.java文件,所以你的代码在一个命名的模块中。fonts/font.ttf资源在fonts包中,所以它是封装的。而font.tff资源在模块的根,这意味着它不在包中,因此它是 * 未 * 封装的。
如果您添加:

opens fonts;

字符串
到您的module-info.java文件,然后您应该能够通过ClassLoader加载fonts/font.ttf
也就是说,使用Class#getResource(String)通常更简单,特别是当调用者、类和资源都在同一个模块中时。

相关问题