我有一个多模块项目。我使用IntelliJ并将src / test / resources标记为测试资源目录。我把abc.txt放在那个目录里。
第一行为我执行的原因是什么,但第二行没有,但适用于其他人?
// this returns a stream
this.getClass().getClassLoader().getResourceAsStream("abc.txt"));
// this returns null
this.getClass().getResourceAsStream("abc.txt"));
我在阅读Google的前几次点击后发现了这些建议,用于加载测试文件。我不知道有什么细节可以让第二个人为某些人而不是我工作。
我发现了一些关于ClassLoader在某些极端情况下不起作用的提示。一旦我把它推到詹金斯身上,这会失败吗?
答案 0 :(得分:1)
每个类都有一个为加载类定义的ClassLoader。在所讨论的上下文中,唯一的区别在于Class.getResourceAsStream
如下:
this.getClass().getResourceAsStream("abc.txt"));
如果对象是由 引导类加载器 加载的,则该方法委托给ClassLoader.getSystemResourceAsStream(java.lang.String)
然后使用搜索路径用于加载类以查找资源。
在委托任何类加载器之前,使用此算法从方法Class.getResourceAsStream
中的给定资源名称构造绝对资源名称:
否则,绝对名称的格式如下: modified_package_name /名称
其中modified_package_name是此对象的包名称,其中'/'替换为'。' ( '\ u002e')。
在您的情况下,后者变为真,因此无法找到资源。