我正在尝试运行一个简单的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,
该异常表示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。