2011-12-21 26 views
10

Mã của tôi (Java) đọc một hình ảnh từ jar:Cách cấu hình sbt để nạp tài nguyên khi chạy ứng dụng?

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

Tất cả mọi thứ chạy tốt (nếu tôi bắt đầu ứng dụng sau khi đóng gói nó vào một cái lọ). Nhưng khi tôi chạy nó bằng cách sử dụng nhiệm vụ run của sbt, nó trả về cho tôi null thay vì luồng cần thiết.

Chạy này từ SBT console cũng cho null:

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

Có cách nào để nói với SBT để đầu tư nguồn lực của tôi trên classpath?

EDIT:

tôi đặt dir nguồn lực để được giống như nguồn dir:

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

Khi tôi nạp 'console SBT của' và chạy như sau:

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

tôi vị trí của các lớp của tôi, nhưng nó không chứa thư mục res cũng như bất kỳ tệp tài nguyên nào của tôi.

Dường như sbt chỉ sao chép tài nguyên vào bình kết quả và không sao chép chúng vào thư mục lớp. Tôi có nên sửa đổi nhiệm vụ biên dịch để di chuyển các tệp tài nguyên này vào thư mục lớp không?

EDIT2:

Vâng, khi tôi tự sao chép các tập tin tài nguyên đến các lớp học dir, tôi có thể dễ dàng truy cập nó từ giao diện điều khiển. Vì vậy, làm thế nào tôi nên tự động hóa quá trình này?

EDIT3:

Dường như SBT chỉ là không thể nhìn thấy thư mục tài nguyên của tôi - nó không thêm tệp vào kết quả file jar, trên thực tế!

Giải pháp:

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

tôi sử dụng 'getResourceAsStream 'từ sbt's' run', 'console' và' test' mà không có vấn đề gì. Có thể một số chi tiết khác sẽ giúp ích cho bạn. Phiên bản nào của sbt? Tệp nằm ở đâu (trong một tệp .jar hoặc 'src/main/resources' khác hoặc tệp khác)? Bạn có bất kỳ plugin hoặc cấu hình nào liên quan đến tài nguyên không? – leedm777

+0

Sbt - phiên bản mới nhất, được tải xuống hôm nay (0.11.2, tôi nghĩ). Tệp nằm ở src/res/logo.png. Và tôi đã thêm "resourceDirectory << = baseDirectory {_ /" src "}" để build.sbt – Rogach

+1

Điều gì xảy ra nếu bạn theo quy ước và đặt tài nguyên vào 'src/main/resources'? – leedm777

Trả lời

4

tôi không thể cung cấp cho bạn một giải pháp đầy đủ ngay bây giờ, nhưng có một thiết lập gọi là resourceDirectories mà bạn có thể thêm các thư mục res.

[EDIT] Đối với tôi, nó cũng không hoạt động nếu tài nguyên nằm trong thư mục tài nguyên chuẩn. Vui lòng thử nó như vậy:

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

[EDIT2] Đây là đầy đủ xây dựng kịch bản (build.scala) mà hoạt động nếu tài nguyên của bạn là trong 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) 
) 
} 
Các vấn đề liên quan