为什么 getResource result 方法在 java8 和 java11 中是不同的



getResource difference

GitHub:资源差异

我发现使用 java8 和 java11 运行的方法getResource的结果是不一样的。

Maven 项目t01java8一起运行,Maven 项目t02java11一起运行

资源结构

resources
- dir
b.txt
a.txt

T01(JDK8)

法典

System.out.println("-----------------0:");
System.out.println(MainTest.class.getResource(""));
System.out.println(MainTest.class.getResource("/"));
System.out.println(MainTest.class.getClassLoader().getResource(""));
System.out.println(MainTest.class.getClassLoader().getResource("/"));//should be null
System.out.println("-----------------1:");
System.out.println(MainTest.class.getResource("/a.txt"));
System.out.println(MainTest.class.getClassLoader().getResource("a.txt"));
System.out.println("-----------------2:");
System.out.println(MainTest.class.getResource("/dir/b.txt"));
System.out.println(MainTest.class.getClassLoader().getResource("dir/b.txt"));

结果

-----------------0:
file:/D:/dev/workspace/test/t01/target/classes/top/topsoft/test/
file:/D:/dev/workspace/test/t01/target/classes/
file:/D:/dev/workspace/test/t01/target/classes/
null
-----------------1:
file:/D:/dev/workspace/test/t01/target/classes/a.txt
file:/D:/dev/workspace/test/t01/target/classes/a.txt
-----------------2:
file:/D:/dev/workspace/test/t01/target/classes/dir/b.txt
file:/D:/dev/workspace/test/t01/target/classes/dir/b.txt

T02(JDK11)

法典

System.out.println("-----------------0:");
System.out.println(MainTest.class.getResource(""));
System.out.println(MainTest.class.getResource("/"));
System.out.println(MainTest.class.getClassLoader().getResource(""));
System.out.println(MainTest.class.getClassLoader().getResource("/"));//should be null
System.out.println("-----------------1:");
System.out.println(MainTest.class.getResource("/a.txt"));
System.out.println(MainTest.class.getClassLoader().getResource("a.txt"));
System.out.println("-----------------2:");
System.out.println(MainTest.class.getResource("/dir/b.txt"));
System.out.println(MainTest.class.getClassLoader().getResource("dir/b.txt"));

结果

-----------------0:
file:/D:/dev/workspace/test/t02/target/classes/top/topsoft/test/
null
null
null
-----------------1:
file:/D:/dev/workspace/test/t02/target/classes/a.txt
file:/D:/dev/workspace/test/t02/target/classes/a.txt
-----------------2:
file:/D:/dev/workspace/test/t02/target/classes/dir/b.txt
null

该项目t01结果与我预期的相同。

但这个项目的结果t02超出我的预期。

MainTest.class.getResource("/")

MainTest.class.getClassLoader().getResource("")

MainTest.class.getClassLoader().getResource("dir/b.txt")

为什么要打印空?

您可以使用 github 存储库尝试一下。

在java11中运行必须具有module-info.java,如果module-info.java不存在,它将在没有模块的情况下运行,结果将与在java8中运行相同

最新更新