2011-12-21 8 views
10

Mi código (Java) lee una imagen del tarro:¿Cómo configurar sbt para cargar recursos cuando se ejecuta la aplicación?

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

Todo funciona muy bien (si comienzo a la aplicación después del envasado en un frasco). Pero cuando lo ejecuto usando la tarea de sbt run, me devuelve null en lugar de la transmisión necesaria.

Correr esto desde SBT console también da nulo:

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

¿Hay una manera de contar SBT para poner mis recursos en la ruta de clase?

EDIT:

puse el directorio de recursos a ser la misma que la fuente dir:

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

Cuando cargué `consola de SBT' y encontré lo siguiente:

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

llegué la ubicación de mis clases, pero no contiene ni la carpeta res ni ninguno de mis archivos de recursos.

Parece que sbt copia recursos solo en el jar resultante y no los copia en las clases dir. ¿Debo modificar la tarea de compilación para mover estos archivos de recursos a las clases dir?

Edit2:

Sí, cuando copio manualmente el archivo de recursos a las clases dir, puedo fácilmente acceder a él desde la consola. Entonces, ¿cómo debo automatizar este proceso?

Edit3:

Parece que SBT es incapaz de ver a mi carpeta de recursos - no se le añade a los archivos resultantes archivo jar, en realidad!

Solución:

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

utilizo 'getResourceAsStream 'from sbt's' run', 'console' y' test' sin problema. Tal vez algunos detalles más ayudarían. ¿Qué versión de sbt? ¿Dónde se encuentra el archivo (en otro .jar, o 'src/main/resources', u otro)? ¿Tiene algún complemento o configuración relacionada con los recursos? – leedm777

+0

Sbt - última versión, descargada hoy (0.11.2, creo). El archivo se encuentra en src/res/logo.png. Y agregué "resourceDirectory << = baseDirectory {_ /" src "}" a build.sbt – Rogach

+1

¿Qué sucede si sigues la convención y colocas el recurso en 'src/main/resources'? – leedm777

Respuesta

4

que no se puede dar una solución completa en este momento, pero hay un ajuste llamado resourceDirectories a la que se podría añadir la carpeta res.

[EDITAR] Para mí, no funcionó también si el recurso estaba en la carpeta de recursos estándar. Por favor, intente esa manera:

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

[Edit2] Esta es la escritura de la estructura completa (build.scala), que funciona si el recurso está en 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) 
) 
} 
Cuestiones relacionadas