Как заставить SBT включать файлы f xml во время компиляции / запуска? - PullRequest
0 голосов
/ 03 февраля 2020

Я создаю свое приложение с 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 фляги. Это не совсем то решение, на которое я надеялся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...