为什么 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
文件中搜索文件时,路径应该写成限制,否则程序将找不到任何东西。
我有一个 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
文件中搜索文件时,路径应该写成限制,否则程序将找不到任何东西。