【发布时间】: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!
我的问题很明显,说实话,有两个:
- 这是怎么回事?
- 如何解决这个问题?
这是我的项目结构:
*.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.1与JDK 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