Java 9.0 | ClassLoader :: getResourceAsStream:NullPointerException

voi*_*ger 10 java classloader getresource java-9

下面的这段代码,我从" / resource "文件夹中的文件夹中获取文件,在Java 8中对我来说很好用:

//e.g fileName = "folder0/file1.extension2"

ClassLoader classLoader = ResourceLoader.class.getClassLoader();
InputStream in = classLoader.getResourceAsStream(fileName);
Scanner scanner = new Scanner(in, "UTF-8");
Run Code Online (Sandbox Code Playgroud)

在Java 9中没有,classLoader.getResourceAsStream(fileName)返回null:

java.lang.NullPointerException: source
Run Code Online (Sandbox Code Playgroud)

但是,如果我直接使用" / resource "文件夹中的文件,这可以正常工作:

fileName = "file0.extension1"; // It works!
Run Code Online (Sandbox Code Playgroud)

我的问题很明显,说实话,有两个:

  1. 到底是怎么回事?
  2. 怎么解决这个问题?

这是我的项目结构:

在此输入图像描述

*.jar输出结构:

*.jar:
- javaFolder1
    -javaFolder1.1
        -ResourceLoader.class
        -jclass1.1.2.class
        -jclass1.1.3.class
    -javaFolder1.2
- javaFolder2
    - ..
- ..

- unreachableResourceFolderImTryingToAccess1
    -resource1.1.ext
    -resource1.2.ext
- unreachableResourceFolderImTryingToAccess2
    - ..
- unreachableResourceFolderImTryingToAccess3
    - ..
-resource0.1.ext
-resource0.2.ext
- ..

- somedll1.dll
- somedll2.dll
- ..
Run Code Online (Sandbox Code Playgroud)

oxi*_*xes 5

在 module_info.java 文件中,您必须打开文件,例如,包含文件的包名称是“resources”,如果该包位于另一个名为“resources_module”的包内,则代码将是:

exports resources_module;
opens resources;
opens resources.(the name of another folder inside the package);
Run Code Online (Sandbox Code Playgroud)

现在您可以访问该文件夹。

如何访问其他班级的资源

  1. 在包“resources_module”内创建一个空类
  2. 从另一个类(包括其他模块),要获得一个InputStream你必须像这样调用你之前创建的类(空类):

    (Your empty class).class.getResourceAsStream(path);