jvm 为什么有时即使资源路径中有输入错误,'getResourceAsStream'也会加载资源?

rur96b6h  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(87)

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

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

当我在单元测试(JUnit 4,运行Gradle 6)中测试函数时,它从资源文件加载文本,尽管有明显的打字错误(资源路径中间的//)。
我也有一个CLI应用程序(在b.jar中),它依赖于a.jar。当CLI应用程序调用loadFooBarText()时,由于找不到资源,它得到了一个空结果。这个问题已经通过修复a.jar中函数中的排印错误(//-〉/)得到了修复。不需要进行其他更改来修复它。
因此,我的问题是为什么 * 错误 * 路径在一种情况下(a.jar的单元测试)有效,而在另一种情况下(来自b.jar的调用)无效?

m2xkgtsf

m2xkgtsf1#

如何使用a.jar运行单元测试?只是在IDE中运行还是使用命令java -jar a.jar
如果你只是在IDE中运行它,我认为区别在于本地文件和zip文件之间的search path
第一个应用程序在target directory中搜索文件,第二个应用程序在jar(一个压缩文件)中搜索文件。
在本地路径中查找文件时,系统会将命令改为正确的命令。
以下两个命令在Windows/Linux中是相同的。

cd work//abc/ddd

cd work/abc/ddd

但是,当搜索文件中的jar文件,这实际上是压缩的zip文件,路径应该是一个限制写入,否则程序将一无所获。

相关问题