getClassLoader().getResourceAsStream()不适用于模块化java项目(openjdk 11)?

getClassLoader().getResourceAsStream()不适用于模块化java项目(openjdk 11)?,java,maven,classloader,java-11,java-module,Java,Maven,Classloader,Java 11,Java Module,这是一个maven项目,在参考资料目录中有一个映像: 代码: 当我将module-info.java添加到项目中时,将打印: stream is null! stream1 is null! stream is null! stream1 is not null! 但当我从项目中删除module-info.java时,将打印: stream is null! stream1 is null! stream is null! stream1 is not null! 为什么??以及如何使用

这是一个maven项目,在参考资料目录中有一个映像:

代码:

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

stream is null!
stream1 is null!
stream is null!
stream1 is not null!
但当我从项目中删除module-info.java时,将打印:

stream is null!
stream1 is null!
stream is null!
stream1 is not null!

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

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

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

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

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

Test.class.getResource("/logo.png")
^这是你大部分时间想要使用的


没有必要检查类加载器。当开发人员不知道如何正确地寻址资源时,我经常会看到这种情况,他们使用相对路径加载资源,但通过类加载器加载资源。类加载器在大多数情况下都可以工作,但在模块化项目/类加载器(如Java9和OSGI)中效果不佳。

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

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

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

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

Test.class.getResource("/logo.png")
^这是你大部分时间想要使用的


没有必要检查类加载器。当开发人员不知道如何正确寻址资源时,我经常会看到这种情况,他们使用相对路径加载资源,但通过类加载器加载资源,类加载器在大多数情况下都能正常工作,但在模块化项目/类加载器(如Java9和OSGI)中效果不佳。

Related-当您从类加载器获取资源时,您已经从根开始了,所以你不应该在前面使用,所以第二个是正确的。模块是另一个故事。相关-当您从ClassLoader获得资源时,您已经从根开始,所以您不应该在前面使用/,所以第二个是正确的。模块是另一回事。我知道Test.class.getResource/logo.png是通过这种方式获取资源的,但我想知道如何使用ClassLoader来加载资源。@郭如果你想使用ClassLoader,你可以在OpenJDK源代码中查看getResourceAsStream的源代码:ClassLoader API文档是更好的资源,特别是声明它只在命名模块的包中查找资源,然后无条件打开包。getResourceAsStream是模块中的代码在其自己的模块中打开资源的正确API。我知道Test.Class.getResource/logo.png通过这种方式获取资源,但是我想知道如何使用类加载器来加载资源。@郭如果你想使用类加载器,你可以查看OpenJDK源代码中getResourceAsStream的源代码:类加载器API文档是一个更好的资源,特别是声明它只在命名模块的包中查找资源,然后无条件打开包。getResourceAsStream是模块中的代码在其自己的模块中打开资源的正确API。