如何运行基本的ScalaFX应用程序?

问题描述 投票:-1回答:1

我正在尝试运行一个简单的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,

scala scalafx
1个回答
0
投票

该异常表示JVM运行时无法找到ScalaFX JAR文件。 (也就是说,运行程序时,ScalaFX JAR文件不在类路径中。)

尝试使用此命令:

scala -cp .\scalafx.jar Window

更新:我只是猜测这对你有用,因为你在成功运行脚本并编译源文件时使用了相同的classpath参数。 (请注意,所有必需的JAR文件必须在编译时和运行时都存在。)

但是,更强大的解决方案是使用SBT来构建和运行您的应用程序(脚本用例不适用于除快速和脏实用程序创建之外的任何其他内容)。

SBT和之前的Maven一样,在应用程序的源文件上强加了一个结构,这使得项目可以让任何其他SBT / Scala开发人员理解。它还将下载并提供您需要的任何依赖库,工具和插件。 (有许多公共和私人工件库,主要是Maven central repository.SBT很乐意使用它,你可以从那里找到ScalaFX。)

为了演示SBT如何简化项目开发,运行应用程序所需要做的就是发出命令(从项目的根目录):

sbt run <project-name>

它将下载所有必需的存储库,如果它还没有这样做,编译任何已更改的源,并一步一步地运行应用程序 - 它将为您处理类路径。

甚至还有用于创建本机安装程序的SBT插件,因此您可以像任何商业应用程序一样安装,运行和卸载代码。

您可以通过链接找到SBT getting started guide

© www.soinside.com 2019 - 2024. All rights reserved.