我的代码(Java)从 jar 中读取图像:
Main.class.getResourceAsStream("/res/logo.png")
一切运行良好(如果我将应用程序打包到罐子后启动应用程序)。但是当我使用 sbt 运行它时run
任务,它返回我null
而不是所需的流。
从 sbt 运行这个console
还给出 null:
getClass.getResourceAsStream("/res/logo.png")
有没有办法告诉 sbt 将我的资源放在类路径上?
EDIT:
我将资源目录设置为与源目录相同:
build.sbt:
resourceDirectory <<= baseDirectory { _ / "src" }
当我加载 sbt 的“控制台”并运行以下命令时:
classOf[Main].getProtectionDomain().getCodeSource()
我得到了我的课程位置,但它不包含res
文件夹或我的任何资源文件。
似乎 sbt 仅将资源复制到生成的 jar,而不将它们复制到类目录。我应该修改编译任务以将这些资源文件移动到类目录吗?
EDIT2:
是的,当我手动将资源文件复制到类目录时,我可以轻松地从控制台访问它。那么,我应该如何自动化这个过程呢?
EDIT3:
似乎 sbt 只是无法看到我的资源文件夹 - 实际上它不会将文件添加到生成的 jar 文件中!
解决方案:
resourceDirectory in Compile <<= baseDirectory { _ / "src" }
我现在无法为您提供完整的解决方案,但有一个名为 ResourceDirectories 的设置,您可以将 res 文件夹添加到其中。
[编辑]
对我来说,如果资源位于标准资源文件夹中,它也不起作用。请尝试这样操作:
Main.class.getClassLoader().getResourceAsStream("icon.png")
[EDIT2] 这是完整的构建脚本(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)
)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)