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