Как настроить sbt для загрузки ресурсов при запуске приложения?
Мой код (Java) читает изображение из jar:
Main.class.getResourceAsStream("/res/logo.png")
Все работает нормально (если я запустил приложение после его упаковки в банку). Но когда я запускаю его с помощью задачи sbt run
, он возвращает мне null
вместо необходимого потока.
Запуск этого из sbt console
также дает null:
getClass.getResourceAsStream("/res/logo.png")
Есть ли способ сказать sbt разместить мои ресурсы в пути к классам?
EDIT:
Я устанавливаю dir ресурсов как те же, что и исходный dir:
build.sbt:
resourceDirectory <<= baseDirectory { _ / "src" }
Когда я загрузил sbt `console 'и выполнил следующее:
classOf[Main].getProtectionDomain().getCodeSource()
Я получил расположение своих классов, но не содержит ни папки res
, ни каких-либо моих файлов ресурсов.
Кажется, что sbt копирует ресурсы только в полученную банку и не копирует их в классы dir. Должен ли я изменить задачу компиляции, чтобы переместить эти файлы ресурсов в классы dir?
EDIT2:
Да, когда я вручную копирую файл ресурсов в каталог dir, я могу легко получить доступ к нему с консоли. Итак, как мне автоматизировать этот процесс?
EDIT3:
Кажется, что sbt просто не может увидеть мою папку ресурсов - она не добавляет файлы в полученный файл jar, фактически!
Решение:
resourceDirectory in Compile <<= baseDirectory { _ / "src" }
Ответы
Ответ 1
Я не могу дать вам полное решение прямо сейчас, но есть параметр, называемый resourceDirectories, к которому вы могли бы добавить папку res.
[EDIT]
Для меня это не сработало, если ресурс находился в стандартной папке ресурса. Пожалуйста, попробуйте так:
Main.class.getClassLoader().getResourceAsStream("icon.png")
[EDIT2] Это полная сборка script (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)
)
}