在sbt中运行主类或测试时无法获取资源

时间:2019-01-28 22:58:17

标签: scala sbt

我正在尝试运行使用sbt中的资源的测试。该测试取决于通过ClassLoader.getSystemResourceAsStream(...)加载资源的util,这在null中导致意外结果。如果我在Intellij中或通过bazel运行相同的测试,则测试成功。我还根据this question的答案中给出的ResourceList示例创建了一个主类来列出所有资源,从而进行了测试,这证实了该文件和许多其他文件在运行时不可访问。

这些资源不包含在sbt通常使用的resources目录中。它们包含在lib目录中包含的jar文件中。 sbt在我的项目中构建的源代码在很大程度上依赖于此jar,并且编译成功,因此看来问题可能特定于资源。我注意到的一件事是,如果我使用ClassLoader对象并调用getResourceAsStream而不是使用静态方法ClassLoader.getSystemResourceAsStream,则可以加载资源。

有人知道如何解决此问题(没有从lib中的jar文件中复制所有资源)?

1 个答案:

答案 0 :(得分:1)

尝试在forked JVM中运行测试:

Test / fork := true
默认情况下,lib/中的

Unmanaged dependencies应该最终出现在所有类路径上,包括test,而不必执行任何特殊操作:

  

lib中的依赖项遍历所有类路径(对于compiletestrun,   和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);
    }