Sbt包命令不复制资源

ber*_*zie 6 scala sbt

我正在使用sbt来处理从中加载图标的简单的小型GUI项目src/main/scala/resources.起初,一切正常,我可以compile.package,和run.生成的jar和类文件都包含资源文件夹.然后我做clean命令.我重新运行compilepackage,和suddently应用程序崩溃.我检查生成的jar和类,发现resources这次没有复制该文件夹.

现在运行应用程序让我NullPointerException指向加载资源的行(图标).

我没有更改sbt构建文件或项目中的任何内容.只要运行clean并重新运行compilepackage.我不知道从哪里开始寻找问题.我应该从哪里开始寻找?我究竟做错了什么?

编辑(最小的例子)

该项目是来自typesafe的g8(https://github.com/typesafehub/scala-sbt.g8)的标准Scala模板.这是我的Build.Scala:

import sbt._
import sbt.Keys._

object ObdscanScalaBuild extends Build {
  val scalaVer = "2.9.2"

  lazy val obdscanScala = Project(
    id = "obdscan-scala",
    base = file("."),
    settings = Project.defaultSettings ++ Seq(
      name := "project name",
      organization := "thesis.bert",
      version := "0.1-SNAPSHOT",
      scalaVersion := scalaVer,
      // add other settings here

      // resolvers

      // dependencies
      libraryDependencies ++= Seq (
        "org.scala-lang" % "scala-swing" % scalaVer,
        "org.rxtx" % "rxtx" % "2.1.7"
      )
    )
  )
}
Run Code Online (Sandbox Code Playgroud)

它之前构建的代码很好.这是项目代码目录结构:

在此输入图像描述

它工作正常,首先在jar中输出这个目录:

在此输入图像描述

而suddently,当我做了clean,并compile通过SBT控制台命令,它没有复制的资源目录中的JAR或类目录(内部目标)了.我现在无法做任何事情来将资源目录复制到目标,除非恢复以前的版本并再次编译它.我通过Windows的历史记录备份恢复以前的版本.

它够清楚了吗?我还需要添加什么吗?

编辑:

将文件移动到之后src/main/resources,编译的文件现在包含资源.但现在,我无法在日食中运行它.这是我的代码:

object ControlPanelContent {
  val IconPath = "/icons/"
  val DefaultIcon = getClass.getResource(getIconPath("icon"))

  def getImage(name: String) = {
    getClass.getResource(getIconPath(name))
  }

  def getIconPath(name: String) = {
    IconPath + name + ".png"
  }
}

case class ControlPanelContent(title: String, iconName: String) extends FlowPanel {
  name = title
  val icon: ImageIcon = createIcon(iconName, 64)

  val pageTitle = new Label(title)

  protected def createIcon(name: String, size: Int): ImageIcon = {
    val path: Option[URL] = Option(ControlPanelContent.getImage(name))

    val img: java.awt.Image = path match {
      case Some(exists) => new ImageIcon(exists).getImage
      case _            => new ImageIcon(ControlPanelContent.DefaultIcon).getImage
    }
    val resizedImg = img.getScaledInstance(size, size, Image.SCALE_SMOOTH)
    new ImageIcon(resizedImg)
  }
}
Run Code Online (Sandbox Code Playgroud)

TLDR版本就是这个,我想:

getClass.getResource("/icons/icon.png")
Run Code Online (Sandbox Code Playgroud)

如果我从sbt console命令调用它是有效的.这是我调用代码时的结果sbt console:

scala> getClass.getResource("/icons/icon.png")
res0: java.net.URL = file:/project/path/target/scala-2.9.2/classes/icons/icon.png
Run Code Online (Sandbox Code Playgroud)

运行时会出现以下异常:

Caused by: java.lang.NullPointerException
    at javax.swing.ImageIcon.<init>(Unknown Source)
    at thesis.bert.gui.ControlPanelContent.createIcon(ControlPanel.scala:54)
    at thesis.bert.gui.ControlPanelContent.<init>(ControlPanel.scala:33)
    at thesis.bert.gui.controls.DTC$.<init>(Diagnostics.scala:283)
    at thesis.bert.gui.controls.DTC$.<clinit>(Diagnostics.scala)
    ... 60 more
Run Code Online (Sandbox Code Playgroud)

编辑2:它现在有效.我刚从eclipse中删除了该项目,重新运行sbt eclipse并且它神奇地起作用.不确定为什么(也许是缓存?).

ins*_* me 7

SBT的资源公约是将它们放入src/main/resources/,而不是src/main/scala/resources/.尝试将resources文件夹向上移动一级.那么它的内容应该包括在内,这意味着你会得到iconsindicator文件夹生成JAR文件中(直接在根级别,而不是里面resources的文件夹).

如果您将资源放在scala中,我认为它只复制编译的文件(即.classscala编译产生的文件).

如果它不能解决您的问题,您可以发布用于加载资源的代码行吗?