8

からアイコンをロードするシンプルで小さなGUIプロジェクトにsbtを使用していますsrc/main/scala/resources。最初は、すべてが正常に機能し、私はできcompileます。package、およびrun。生成されたjarファイルとクラスファイルにはすべて、リソースフォルダーが含まれています。次に、cleanコマンドを実行します。とを再実行するcompilepackage、突然アプリケーションがクラッシュします。生成された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"
      )
    )
  )
}

以前はコードを正常にビルドします。プロジェクトコードのディレクトリ構造は次のとおりです。

ここに画像の説明を入力してください

それは正常に動作し、最初はjar内にこのディレクトリを出力します。

ここに画像の説明を入力してください

そして突然、sbtコンソールを介してコマンドを実行するcleancompile、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)
  }
}

TLDRバージョンはこれだと思います:

getClass.getResource("/icons/icon.png")

コマンドから呼び出すと機能し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

これを実行すると、次の例外が発生します。

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

編集2:それは今動作します。プロジェクトをEclipseから削除して再実行するsbt eclipseと、魔法のように機能します。理由がわからない(多分キャッシング?)。

4

1 に答える 1

8

リソースのSBT規則は、リソースをに入れることでありsrc/main/resources/、ではありませんsrc/main/scala/resources/resourcesフォルダを1レベル上に移動してみてください。次に、そのコンテンツを含める必要があります。つまり、生成されたjarファイル内のフォルダーを取得iconsindicatorます(フォルダー内ではなく、ルートレベルで直接resources)。

.classリソースをscalaに入れると、コンパイルされたファイル(つまり、scalaコンパイルの結果のファイル)のみがコピーされると思います。

問題が解決しない場合は、リソースの読み込みに使用するコード行を投稿できますか?

于 2012-11-25T19:35:57.240 に答える