为什么 getResourceAsStream 有时会加载资源,即使资源路径中有拼写错误?

Why does `getResourceAsStream` sometimes load a resource even when there is a typo in the resource path?

我有一个 Jar(我们称它为 a.jar),其中包含路径 foo/bar.txt 中的资源和如下函数:

object FooBarLoader {
    fun loadFooBarText() = javaClass.getResourceAsStream("foo//bar.txt")
        ?.bufferedReader()
        ?.readLines()
        ?.joinToString("\n")
} 

当我在单元测试(JUnit 4,运行 Gradle 6)中测试函数时,它从资源文件加载文本,尽管有明显的拼写错误(//在资源路径的中间)。

我还有一个依赖于 a.jar 的 CLI 应用程序(在 b.jar 中)。当 CLI 应用程序调用 loadFooBarText() 时,由于未找到资源,它得到一个空结果。这是通过修复 a.jar 函数中的拼写错误 (// -> /) 解决的。无需其他更改即可修复它。

所以,我的问题是为什么 错误的 路径在一种情况下(a.jar 的单元测试)而不是另一种情况(来自 [=14= 的调用) ])?

你如何 运行 使用 a.jar 进行单元测试?只需 运行 它在你的 IDE 或使用命令 java -jar a.jar ?

如果你运行它只是在IDE,我认为区别在于本地文件和zip文件之间的search path

您的第一个应用程序在 target directory 中搜索文件,第二个应用程序在压缩文件 jar 中搜索文件。

在本地路径搜索文件时,命令会被系统右移

以下两个命令在Windows/Linux.

中是一样的
cd work//abc/ddd

cd work/abc/ddd

但是在实际上是zip压缩文件的jar文件中搜索文件时,路径应该写成限制,否则程序将找不到任何东西。