Как мне запустить простое приложение ScalaFX? - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь запустить простую программу ScalaFX, которая отображает окно, в котором ничего нет.

Я могу запустить программу как файл сценария с желаемым результатом, но как только я добавляю основной объектдля программы она все еще работает, но не выдает окно.Я могу скомпилировать файл без сценария, но если я пытаюсь запустить его, я получаю следующие ошибки:

java.lang.NoClassDefFoundError: scalafx/application/JFXApp$PrimaryStage
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.privateGetMethodRecursive(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at scala.reflect.internal.util.ScalaClassLoader.run(ScalaClassLoader.scala:95)
        at scala.reflect.internal.util.ScalaClassLoader.run$(ScalaClassLoader.scala:91)
        at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:125)
        at scala.tools.nsc.CommonRunner.run(ObjectRunner.scala:22)
        at scala.tools.nsc.CommonRunner.run$(ObjectRunner.scala:21)
        at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:39)
        at scala.tools.nsc.CommonRunner.runAndCatch(ObjectRunner.scala:29)
        at scala.tools.nsc.CommonRunner.runAndCatch$(ObjectRunner.scala:28)
        at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:39)
        at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:66)
        at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:85)
        at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:96)
        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:101)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
Caused by: java.lang.ClassNotFoundException: scalafx.application.JFXApp$PrimaryStage
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 19 more

Что я делаю не так?


    // Script file that works
    import scalafx.application.JFXApp

    val app = new JFXApp {
        stage = new JFXApp.PrimaryStage {
            title = "First GUI"
        }
    }

    app.main(args)


    // I run this in powershell with the following command:
    //scala -cp .\scalafx.jar .\program.scala


    // Program (non-script file) that doesn't give any errors when compiled but won't run. I can run this as a script file, but no window appears.

    import scalafx.application.JFXApp

    object Window extends JFXApp {
        stage = new JFXApp.PrimaryStage {
            title = "First GUI"
        }
    }

    // I compile this in powershell with the following command:
    //scalac -cp .\scalafx.jar .\program.scala
    // And run with this command:
    // scala Window

Скомпилированная программа генерирует следующие имена для файлов классов (если это помогает):

Window $$ anon $ 1.class, Window $ .class, Window $ delayedInit $ body.class, Window.class,

1 Ответ

0 голосов
/ 25 апреля 2019

Исключение указывает на то, что среде выполнения JVM не удалось найти файл ScalaFX JAR . (То есть файл ScalaFX JAR не находится в classpath , когда программа была запущена.)

Попробуйте использовать эту команду:

scala -cp .\scalafx.jar Window

ОБНОВЛЕНИЕ : Я только предполагаю, что это будет работать для вас, учитывая, что вы использовали тот же аргумент classpath, когда вы успешно запустили скрипт и скомпилировали исходный файл. (Обратите внимание, что все необходимые файлы JAR должны присутствовать как во время компиляции , так и во время выполнения.)

Однако более надежным решением было бы использовать SBT как для сборки, так и для запуска приложения (сценарий использования сценариев не идеален ни для чего, кроме быстрой и грязной утилиты создание).

SBT , подобно Maven перед ним, накладывает структуру на исходные файлы вашего приложения, что немедленно делает проект понятным для любого другого SBT / Scala разработчик. Он также загрузит и сделает доступными любые зависимые библиотеки, инструменты и плагины, которые вам нужны. (Существует несколько публичных и частных репозиториев артефактов , основным из которых является Maven центральное репозиторий . SBT с радостью воспользуется этим и оттуда вы найдете ScalaFX .)

Чтобы продемонстрировать, как SBT упрощает разработку вашего проекта, все, что вам нужно сделать, чтобы запустить приложение, - это выдать ему команду (из корневого каталога вашего проекта):

sbt run <project-name>

Он загрузит все необходимые репозитории, если это еще не сделано, скомпилирует все измененные исходные коды и запустит приложение за один шаг - и он позаботится о пути к классам для вас.

Есть даже SBT плагинов для создания собственных установщиков, так что вы можете устанавливать, запускать и удалять свой код, как любое коммерческое приложение.

Вы можете найти SBT руководство по началу работы по ссылке.

...