我們正在建設使用ScalaFX
申請後讀取XML文件。當我在IntelliJIDEA中運行項目時,一切正常。但是,當我創建jar文件並嘗試執行它時,我在讀取某個xml文件時出錯。 我嘗試過在SO中發佈的各種解決方案,但沒有用。問題與創建罐子
package com.app.adt
import scalafx.application.JFXApp
import scalafx.Includes._
import scalafx.scene.Scene
import scala.reflect.runtime.universe.typeOf
import scalafxml.core.{FXMLView, DependenciesByType}
object App extends JFXApp {
val root = FXMLView(getClass.getResource("/com/app/adt/Home.fxml"),
new DependenciesByType(Map(
typeOf[TestDependency] -> new TestDependency("ADT"))))
stage = new JFXApp.PrimaryStage() {
title = "ADT"
scene = new Scene(root)
}
}
中的XML文件(Home.fxml
)被放置在com/app/adt
包。我正在使用sbt-one-jar
創建jar文件。
我已經試過路徑的不同組合,但alwasys給出了同樣的錯誤。
錯誤堆棧:
Caused by: javafx.fxml.LoadException:
file:/adt-app_2.11-1.3-SNAPSHOT-one-jar.jar!/main/adt-app_2.11-1.3-S
NAPSHOT.jar!/com/app/adt/Home.fxml
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2611)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2589)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2435)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2403)
at scalafxml.core.FXMLView$.apply(FXMLView.scala:17)
罐結構:
adt-app_2.11-1.3-SNAPSHOT-one-jar.jar
|
main
|
adt-app_2.11-1.3-SNAPSHOT.jar
|
com\app\adt
|
App.scala
Home.fxml
而且,我試圖與sbt-assembly
,而不是sbt-one-jar
。但是,仍然有同樣的錯誤。 :(
試圖與下面的答案在SO:
嗯,這很有趣 - 我用它在Q1提到非常相似的代碼和'getResourceAsStream'行之有效的我(使用'sbt-assembly')。我建議你在沒有JavaFX的情況下設置一個新的空白應用程序,並嘗試加載XML資源。如果它不起作用,你有一個更簡單的問題來處理。如果有效,問題可能是JavaFX。在這種情況下,你更瞭解這個問題。現在我無法幫助你,然後提出進一步的問題分析:) – petrbel
@petrbel,getResourceAsStream也適用於我。但ScalaFX方法需要一個URL,而不是一個流。爲此,我使用了getResource。這是什麼給予的問題:( –
我看,我提供了一個更長的解釋作爲答案 - 希望它澄清:) – petrbel