Java 9.0 |类加载器::getResourceAsStream: NullPointerException

标签 java classloader java-9 getresource

下面这段代码,我从“/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");

在 Java 9 中它不会,classLoader.getResourceAsStream(fileName) 返回 null:

java.lang.NullPointerException: source

但是,如果我直接使用“/resource”文件夹中的文件,则效果很好:

fileName = "file0.extension1"; // It works!

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

  1. 发生了什么事?
  2. 如何解决?

这是我的项目结构:

enter image description here

*.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
- ..

最佳答案

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

exports resources_module;
opens resources;
opens resources.(the name of another folder inside the package);

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

如何访问其他类(class)的资源

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

    (你的空类).class.getResourceAsStream(path);

关于Java 9.0 |类加载器::getResourceAsStream: NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47613602/

相关文章:

java - 将两个 CompletableFutures 链接在一起,每个 CompletableFutures 返回列表

java - 为什么 java.sql.DriverManager.getCallerClassLoader() 是 native 的?

java - 如何向模块路径添加依赖项?

java - 私有(private)接口(interface)方法,示例用例?

java - 在netty的socket.io实现中是否可以延迟发送ack?

java - android webview加载图像

Java 转换/类加载器问题

c++ - 如何从另一个文件加载类 - Visual Studio C++

java - 如何检查一个 jar 是否是多版本的

java - 编写一个与浏览器交互的简单网络爬虫(Java)