2011-12-21 14 views
10

Moje kodu (Java) odczytuje obraz ze słoika:Jak skonfigurować sbt do ładowania zasobów podczas uruchamiania aplikacji?

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

Wszystko działa dobrze (jeśli uruchomić aplikację po zapakowaniu go do słoika). Ale kiedy uruchomię go za pomocą zadania sbt, run, to zwraca mi null zamiast potrzebnego strumienia.

Running to z SBT console również daje zerowy:

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

Czy istnieje sposób, aby powiedzieć SBT umieścić swoje zasoby na ścieżce klasy?

EDIT:

ustawić dir zasobów być taka sama jak źródłowego reż:

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

Kiedy załadowany `konsolę SBT za” i pobiegł co następuje:

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

mam lokalizacja moich klas, ale nie zawiera ona ani folderu res, ani żadnego z moich plików zasobów.

Wydaje się, że sbt kopiuje zasoby tylko do wynikowego słoika i nie kopiuje ich do klas dir. Czy powinienem zmodyfikować zadanie kompilacji, aby przenieść te pliki zasobów do katalogu klas?

EDIT2:

Tak, kiedy ręcznie skopiować plik zasobów do klasy dir, mogę łatwo uzyskać do niego dostęp z poziomu konsoli. Jak zatem zautomatyzować ten proces?

Edit3:

Wydaje się, że SBT jest po prostu w stanie zobaczyć mój folderu zasobów - nie dodawać pliki do wynikowego pliku jar, faktycznie!

Rozwiązanie:

resourceDirectory in Compile <<= baseDirectory { _/"src" } 
+1

używam 'getResourceAsStream 'od sbt' run', 'console' i' test' bez problemu. Może trochę więcej szczegółów pomogłoby. Jaką wersję sbt? Gdzie znajduje się plik (w innym .jar lub 'src/main/resources' lub innym)? Czy masz jakieś wtyczki związane z zasobami lub konfigurację? – leedm777

+0

Sbt - najnowsza wersja, pobrana dzisiaj (0.11.2, myślę). Plik znajduje się w src/res/logo.png. I dodałem "resourceDirectory << = baseDirectory {_ /" src "}" do build.sbt – Rogach

+1

Co się stanie, jeśli będziesz przestrzegać konwencji i umieścisz zasób w 'src/main/resources'? – leedm777

Odpowiedz

4

Nie mogę dać Ci pełne rozwiązanie w tej chwili, ale jest tam ustawienie nazywa resourceDirectories, do którego można dodać folder Res.

[EDIT] Dla mnie to nie działało, jeśli zasób był w standardowym folderze zasobów. Spróbuj to w ten sposób:

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

[EDIT2] Jest to pełny kompilacji skryptu (build.scala), który działa, jeśli zasób jest w 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) 
) 
} 
Powiązane problemy