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

时间:2019-04-24 22:01:40

标签: scala scalafx

我正在尝试运行一个简单的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 :(得分:0)

该异常表明 JVM运行时无法找到 ScalaFX JAR 文件。 (也就是说,运行程序时 ScalaFX JAR 文件不在 classpath 上。)

尝试使用此命令:

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