如何在运行应用程序时配置sbt加载资源?

Rog*_*ach 11 scala sbt

我的代码(Java)从jar中读取一个图像:

Main.class.getResourceAsStream("/res/logo.png")
Run Code Online (Sandbox Code Playgroud)

一切都运行正常(如果我将应用程序打包到罐子后启动应用程序).但是当我使用sbt的run任务运行它时,它返回我null而不是所需的流.

从sbt运行此命令console也会给出null:

getClass.getResourceAsStream("/res/logo.png")
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉sbt将我的资源放在classpath上?

编辑:

我将资源目录设置为与源目录相同:

build.sbt:
resourceDirectory <<= baseDirectory { _ / "src" }
Run Code Online (Sandbox Code Playgroud)

当我加载sbt的`console'并执行以下操作时:

classOf[Main].getProtectionDomain().getCodeSource()
Run Code Online (Sandbox Code Playgroud)

我得到了我的类的位置,但它既不包含res文件夹也不包含任何资源文件.

似乎sbt只将资源复制到生成的jar中,并且不会将它们复制到类dir.我应该修改编译任务来将这些资源文件移动到类目录吗?

EDIT2:

是的,当我手动将资源文件复制到类目录时,我可以从控制台轻松访问它.那么,我应该如何自动化这个过程呢?

EDIT3:

似乎sbt只是无法看到我的资源文件夹 - 它实际上并没有将文件添加到生成的jar文件中!

解:

resourceDirectory in Compile <<= baseDirectory { _ / "src" }
Run Code Online (Sandbox Code Playgroud)

Chr*_*ian 4

我现在无法为您提供完整的解决方案,但有一个名为 resourceDirectories 的设置,您可以将 res 文件夹添加到其中。

[编辑] 对我来说,如果资源位于标准资源文件夹中,它也不起作用。请尝试这样操作:

Main.class.getClassLoader().getResourceAsStream("icon.png")
Run Code Online (Sandbox Code Playgroud)

[EDIT2] 这是完整的构建脚本(build.scala),如果您的资源位于 src/main/java 中,则该脚本可以工作:

import sbt._
import Keys._

object TestBuild extends Build {

  lazy val buildSettings = Seq(
    organization := "com.test",
    version := "1.0-SNAPSHOT",
    scalaVersion := "2.9.1"
  )

  lazy val test  = Project(
    id = "test",
    base = file("test"),
    settings = Defaults.defaultSettings ++ Seq(resourceDirectory in Compile <<= javaSource in Compile)
  )
}
Run Code Online (Sandbox Code Playgroud)