Java getClassLoader()。getResourceAsStream(filename)

时间:2017-05-13 14:58:17

标签: java maven classloader

我有一个Maven项目。我的整个代码都在{PROJECT_ROOT} / src / main / java文件夹中。当我写代码时:

InputStream input = VertxApp.class.getClassLoader().getResourceAsStream("file.txt");
String result = getStringFromInputStream(input);
System.out.println(result);

我看到代码在文件夹中查找名为“file.txt”的文件: {PROJECT_ROOT} / SRC /主/资源。

我的问题是为什么。为什么不查找{PROJECT_ROOT} / src / main / java或$ {PROJECT_ROOT}中的文件?

2 个答案:

答案 0 :(得分:2)

大多数Maven项目都遵循

的结构
src/
  main/
    java/
    resources/

您打算将非代码资源与代码分开。 getResourceAsStream方法假定遵循此标准,因此它从resources/目录开始查找您的资源。

有关更详细的想法,请参阅Why are project layout resources are kept separate from Java sources?

答案 1 :(得分:1)

当您构建maven项目或从支持maven的IDE运行它时,来自src/main/java的java文件将被编译为类文件并放入PROJECT_ROOT/target/classes

来自src/main/resources的文件也会复制到PROJECT_ROOT/target/classes

当您调用VertxApp.class.getClassLoader().getResourceAsStream("file.txt")时,您将获得VertxApp类的类加载器,此类加载器将尝试从加载类的路径加载给定资源。

如果您的VertxApp类位于顶层包中,则该类文件将位于target/classes中,并且将在那里搜索资源,并指定相对路径"file.txt"因此,您必须将其放入src/main/resources

如果VertxApp类位于名为mypackage的包中,那么类文件将位于target/classes/mypackage中,您应该将文件放在src/main/resources/mypackage中,以便它也会在target/classes/mypackage中结束。

如果包中有VertxApp类,但想将文件保存在src/main/resources(没有子目录),则必须将其作为绝对路径引用,如下所示:

VertxApp.class.getClassLoader().getResourceAsStream("/file.txt")