gpt4 book ai didi

java - 加载测试文件仅在使用 ClassLoader 时有效

转载 作者:行者123 更新时间:2023-11-30 10:22:28 25 4
gpt4 key购买 nike

我有一个多模块项目。我正在使用 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 在某些极端情况下不起作用的提示。一旦我将它推送到 Jenkins,这会失败吗?

最佳答案

每个类都有一个 ClassLoader 定义用于加载类。在所讨论的上下文中,唯一的区别是 Class.getResourceAsStream如:

this.getClass().getResourceAsStream("abc.txt"));

如果对象是由引导类加载器加载的,该方法委托(delegate)给ClassLoader.getSystemResourceAsStream(java.lang.String)然后使用用于加载类的搜索路径来查找资源。

在委派给任何类加载器之前,一个绝对资源名称是从给定的资源名称构造的Class.getResourceAsStream 方法中使用此算法:

  • 如果名称以“/”(“\u002f”)开头,则资源的绝对名称是名称中“/”之后的部分。
  • 否则,绝对名称的形式如下:modified_pa​​ckage_name/名称

    其中 modified_pa​​ckage_name 是此对象的包名称,用“/”代替“.” ('\u002e').

在您的情况下,后者变为 true,因此无法找到资源。

关于java - 加载测试文件仅在使用 ClassLoader 时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47373527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com