からアイコンをロードするシンプルで小さなGUIプロジェクトにsbtを使用していますsrc/main/scala/resources
。最初は、すべてが正常に機能し、私はできcompile
ます。package
、およびrun
。生成されたjarファイルとクラスファイルにはすべて、リソースフォルダーが含まれています。次に、clean
コマンドを実行します。とを再実行するcompile
とpackage
、突然アプリケーションがクラッシュします。生成されたjarとクラスを確認したところ、今回はresources
フォルダーがコピーされていないことがわかりました。
アプリケーションを実行するNullPointerException
と、リソース(アイコン)をロードする行を指すようになります。
プロジェクト内のsbtビルドファイルなどは変更しませんでした。実行しclean
て再実行するだけです。どこから問題を探し始めるのかわかりません。どこから始めればいいですか?私は何が間違っているのですか?compile
package
編集(最小限の例)
このプロジェクトは、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コンソールを介してコマンドを実行するclean
とcompile
、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
と、魔法のように機能します。理由がわからない(多分キャッシング?)。