我正在尝试运行使用sbt中的资源的测试。该测试取决于通过ClassLoader.getSystemResourceAsStream(...)
加载资源的util,这在null
中导致意外结果。如果我在Intellij中或通过bazel运行相同的测试,则测试成功。我还根据this question的答案中给出的ResourceList
示例创建了一个主类来列出所有资源,从而进行了测试,这证实了该文件和许多其他文件在运行时不可访问。>
这些资源不包含在sbt通常使用的resources
目录中。它们包含在lib
目录中包含的jar文件中。 sbt在我的项目中构建的源代码在很大程度上依赖于此jar,并且编译成功,因此看来问题可能特定于资源。我注意到的一件事是,如果我使用ClassLoader
对象并调用getResourceAsStream
而不是使用静态方法ClassLoader.getSystemResourceAsStream
,则可以加载资源。
有人知道如何解决此问题(没有从lib
中的jar文件中复制所有资源)?
答案 0 :(得分:1)
尝试在forked JVM中运行测试:
Test / fork := true
默认情况下,lib/
中的 Unmanaged dependencies应该最终出现在所有类路径上,包括test
,而不必执行任何特殊操作:
lib
中的依赖项遍历所有类路径(对于compile
,test
,run
, 和console
)。
注意,在IntelliJ中运行测试时,您可能使用的是IntelliJ的内部构建系统,而不是SBT Shell,这可能是它在IntelliJ中起作用的原因。要通过sbt shell在IntelliJ中运行测试,请选中Edit Configurations...
Use sbt
复选框
我建议使用getClass.getResourceAsStream
,因为无论如何这都将 system ClassLoader
用作fallback:
public InputStream getResourceAsStream(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResourceAsStream(name);
}
return cl.getResourceAsStream(name);
}