Я создаю свое приложение с Scala и JavaFX с использованием SBT. Я не использую ScalaFX. Метод start
в моем классе Main
имеет следующие строки:
val fxmlFile = getClass.getResource("appGUI.fxml")
val root: Parent = FXMLLoader.load(fxmlFile)
Когда все упаковано в jar путем создания артефакта через IntellJ, все работает как положено. Однако, когда я делаю SBT run
или SBT assembly
, используя плагин SBT-сборки, он завершается с ошибкой:
Exception in Application start method
[error] (run-main-0) java.lang.RuntimeException: Exception in Application start method
Workaround until RT-13281 is implemented: keep toolkit alive
[error] java.lang.RuntimeException: Exception in Application start method
[error] at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
[error] at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
[error] at java.lang.Thread.run(Thread.java:748)
[error] Caused by: java.lang.NullPointerException: Location is required.
SBT не включает файл f xml в артефакт Файл .jar, который он создает в целевом каталоге (что, я предполагаю, он использует для запуска). Для разработки было бы неплохо иметь возможность просто использовать SBT run
. Что-то, что я могу добавить в свой build.sbt, чтобы заставить это работать?
Редактировать
Для получения дополнительной информации, моя структура каталогов для соответствующих файлов выглядит например:
-root
-src
-main
-ca.mktsk.app
-scala
Main.scala
AppGUI.scala
appGUI.fxml
Во время компиляции все. scala источники копируются в target
для создания структуры каталогов, подобной этой:
-target
-ca
-mktsk
-app
-classes
Main.scala
AppGUI.scala
, которая затем компилируется.
Если после компиляции я добавляю файл .f xml в соответствующее место в целевом каталоге и снова компилирую, он работает как положено, упаковывая .f xml в сгенерированный jar. Должен пояснить, что именно поэтому SBT-сборка работала раньше. Обычно это терпит неудачу так же, как run
. Построение артефактов IntelliJ - единственное, что, кажется, работает прямо из ворот. Я обновил текст в своем исходном вопросе, чтобы отразить это.
Мне удалось несколько заставить эту программу работать, добавив следующие строки в build.sbt:
Compile / unmanagedResourceDirectories += baseDirectory.value / "src" / "main" / "fxml"
Compile / unmanagedResources / includeFilter := "*.fxml"
Какие требует, чтобы я добавил каталог f xml в src/main
, чтобы сохранить все файлы f xml. Все они копируются в каталог classes
в target и упаковываются в root фляги. Это не совсем то решение, на которое я надеялся.