我有一个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
的调用)无效?
1条答案
按热度按时间m2xkgtsf1#
如何使用
a.jar
运行单元测试?只是在IDE中运行还是使用命令java -jar a.jar
?如果你只是在IDE中运行它,我认为区别在于本地文件和
zip
文件之间的search path
。第一个应用程序在
target directory
中搜索文件,第二个应用程序在jar
(一个压缩文件)中搜索文件。在本地路径中查找文件时,系统会将命令改为正确的命令。
以下两个命令在Windows/Linux中是相同的。
但是,当搜索文件中的
jar
文件,这实际上是压缩的zip
文件,路径应该是一个限制写入,否则程序将一无所获。