我有一个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}中的文件?
答案 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")