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

Posted

技术标签:

【中文标题】如何配置 sbt 在运行应用程序时加载资源?【英文标题】:How to configure sbt to load resources when running application? 【发布时间】:2012-01-25 04:11:01 【问题描述】:

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

Main.class.getResourceAsStream("/res/logo.png")

一切运行良好(如果我在将应用程序打包到 jar 后启动应用程序)。但是当我使用 sbt 的 run 任务运行它时,它返回我 null 而不是需要的流。

从 sbt console 运行它也会给出 null:

getClass.getResourceAsStream("/res/logo.png")

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

编辑:

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

build.sbt:
resourceDirectory <<= baseDirectory  _ / "src" 

当我加载 sbt 的 `console' 并运行以下内容时:

classOf[Main].getProtectionDomain().getCodeSource()

我获得了课程的位置,但它既不包含 res 文件夹也不包含我的任何资源文件。

似乎 sbt 仅将资源复制到生成的 jar 中,而不将它们复制到 classes 目录。我应该修改编译任务以将这些资源文件移动到类目录吗?

EDIT2:

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

EDIT3:

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

解决方案:

resourceDirectory in Compile <<= baseDirectory  _ / "src" 

【问题讨论】:

我使用来自 sbt 的 runconsoletestgetResourceAsStream 没有问题。也许更多细节会有所帮助。什么版本的sbt?文件位于何处(在另一个 .jar 或 src/main/resources 或其他中)?你有任何与资源相关的插件或配置吗? Sbt - 最新版本,今天下载(我认为是 0.11.2)。文件位于 src/res/logo.png。我在 build.sbt 中添加了“resourceDirectory 如果你按照约定将资源放入src/main/resources会发生什么? @dave - 什么都没有。还是不行。 【参考方案1】:

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

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

Main.class.getClassLoader().getResourceAsStream("icon.png")

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

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)
  )

【讨论】:

以上是关于如何配置 sbt 在运行应用程序时加载资源?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用SBT和Scala正确管理开发和生产中的logback配置?

如何从scala对象中的sbt ProjectPlugin.scala加载对象

如何从 SBT 运行 webpack

如何在没有 sbt 的情况下运行 sbt 管理的应用程序项目?

SBT包括程序中的版本号

SBT 停止运行而不退出