2011-12-21 12 views
10

Il mio codice (Java) legge un'immagine dal vaso:Come configurare sbt per caricare risorse durante l'esecuzione dell'applicazione?

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

Tutto funziona bene (se inizio l'applicazione dopo il confezionamento in un barattolo). Ma quando lo eseguo usando l'attività run di sbt, mi restituisce null invece del flusso necessario.

L'esecuzione di questo da SBT console dà anche nullo:

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

C'è un modo per dire SBT di mettere le mie risorse sul classpath?

EDIT:

ho impostato il dir risorse per essere uguale a dir fonte:

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

Quando ho caricato `console di SBT' ed eseguito il seguente:

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

ho ottenuto la posizione delle mie classi, ma non contiene né la cartella res né alcuno dei miei file di risorse.

Sembra che sbt copi le risorse solo nel jar risultante e non le copi nella directory delle classi. Dovrei modificare l'attività di compilazione per spostare questi file di risorse nella directory delle classi?

EDIT2:

Sì, quando copio manualmente il file di risorse alle classi dir, posso facilmente accedere da console. Quindi, come dovrei automatizzare questo processo?

Edit3:

Sembra che SBT è solo in grado di vedere la mia cartella delle risorse - non aggiungere file risultante file jar, in realtà!

Soluzione:

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

Io uso 'getResourceAsStream 'da sbt's' run', 'console' e' test' senza problemi. Forse altri dettagli potrebbero aiutare. Quale versione di sbt? Dove si trova il file (in un altro .jar, o 'src/main/resources', o altro)? Avete plugin o configurazioni relativi alle risorse? – leedm777

+0

Sbt - ultima versione, scaricata oggi (0.11.2, penso). Il file si trova in src/res/logo.png. E ho aggiunto "resourceDirectory << = baseDirectory {_ /" src "}" a build.sbt – Rogach

+1

Cosa succede se segui la convenzione e inserisci la risorsa in 'src/main/resources'? – leedm777

risposta

4

Non si può dare una soluzione completa in questo momento, ma c'è un ambiente chiamato resourceDirectories a cui si potrebbe aggiungere la cartella res.

[EDIT] Per me non ha funzionato anche se la risorsa era nella cartella delle risorse standard. Si prega di provare in questo modo:

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

[EDIT2] Questo è lo script generazione completa (build.scala), che funziona se la risorsa è in 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) 
) 
} 
Problemi correlati