首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getClassLoader().getResourceAsStream()不能在模块化java项目(openjdk 11)中工作?

getClassLoader().getResourceAsStream()不能在模块化java项目(openjdk 11)中工作?
EN

Stack Overflow用户
提问于 2020-04-20 07:07:05
回答 1查看 943关注 0票数 1

这是一个maven项目,在资源目录中有一个映像。

代码语言:javascript
复制
├─ src
   ├─ main
       ├─ java
       └─ resources  
          └─imgs
            └─logo.png

代码:

代码语言:javascript
复制
public class Test {
    public static void main(String[] args) {
        InputStream stream = Test.class.getClassLoader().getResourceAsStream("/imgs/logo.png");
        InputStream stream1 = Test.class.getClassLoader().getResourceAsStream("imgs/logo.png");
        System.out.println(stream == null ? "stream is null!" : "stream is not null!");
        System.out.println(stream1 == null ? "stream1 is null!" : "stream1 is not null!");
    }
}

当我 module-info.java添加到项目中时,将打印:

代码语言:javascript
复制
stream is null!
stream1 is null!

但是,当我从项目中删除 module-info.java时,将打印:

代码语言:javascript
复制
stream is null!
stream1 is not null!

为什么?以及如何在模块化的java项目中使用ClassLoader加载资源?

EN

回答 1

Stack Overflow用户

发布于 2020-04-20 07:28:15

资源应该通过Test.class加载,而不是通过ClassLoader加载。通过通过类加载资源,可以为资源所在的位置建立上下文(JAR、模块、依赖项)。

对于同一包中的资源,请使用相对路径:

代码语言:javascript
复制
Test.class.getResource("logo.png")

如果测试的限定名为org.foo.Test,它将在JAR中(或在资源文件夹中,在构建JAR之前)查找org/foo/logo.png中的资源。

对于同一模块中的资源,请使用绝对路径,从斜杠开始:

代码语言:javascript
复制
Test.class.getResource("/logo.png")

这是你大部分时间想要使用的东西。

--没有必要检查类加载器。当开发人员不知道如何正确地定位资源,并使用相对路径加载资源,但通过类加载器加载资源时,我经常看到这种情况,而类加载器在大多数情况下都能工作,但在模块化项目/类加载器(如Java9和OSGI )中却不是很好。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61316839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档