【问题标题】:Java 9.0 | ClassLoader::getResourceAsStream: NullPointerExceptionJava 9.0 |类加载器::getResourceAsStream: NullPointerException
【发布时间】:2018-05-16 18:02:58
【问题描述】:

下面的这段代码,我从“/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. 如何解决这个问题?

这是我的项目结构

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

【问题讨论】:

  • resource 文件夹如何在您的类路径中结束?
  • @OliverCharlesworth,/src/main/resources 中的所有文件和文件夹都在我的 .jar 文件的根目录下。
  • 在使用 Maven 和 JDK 9.0.1JDK 1.8.0_121 导出可运行 jar 时没有得到相同的行为,嗯虽然很奇怪,但在从 eclipse 导出时得到了相同的行为,注意到 eclipse 创建了一个文件夹jar 文件中的 resources
  • 试试/folder0/file1.extension2
  • 如果 JAR 文件确实包含更新问题中列出的资源,则调用 ResourceLoader.class.getResourceAsStream(name),其中 name 是“/resource0.1.txt”、“/unreachableResourceFolderImTryingToAccess1/”中的任何一个resource1.1.ext”、“jclass1.1.2.class”、“/javaFolder1/javaFolder1.1/jclass1.1.2.class”应该可以工作。如果 ResourceLoader.class.getClassLoader().getResourceAsStream(name) 使用“resource0.1.txt”、“unreachableResourceFolderImTryingToAccess1/resource1.1.ext”、“/javaFolder1/javaFolder1.1/jclass1.1.2.class”调用,则同上。 JDK 8 和 JDK 9 没有区别。

标签: java classloader java-9 getresource


【解决方案1】:

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

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

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

如何访问其他班级的资源

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2013-05-16
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多