Sta*_*tas 4 java scala javafx sbt javafx-2
当尝试从sbt 0.10.1运行用Scala 2.8.1编写的简单JavaFX 2.0 beta应用程序时,在关闭应用程序窗口后会抛出异常:
> run
[info] Running com.tradex.priceviewer.Main
Exception while removing reference: java.lang.InterruptedException
java.lang.InterruptedException
[ at java.lang.Object.wait(Native Method)success
] at java.lang.ref.ReferenceQueue.remove(Unknown Source)Total time: 5 s, completed Aug 5, 2011 1:12:04 PM
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
at com.sun.glass.utils.Disposer.run(Disposer.java:64)>
at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
从命令行运行应用程序时,不会抛出异常,返回的状态为0.应用程序的代码如下:
class Starter extends Application {
def main(args: Array[String]) {
Application.launch(args)
}
override def start(s: Stage) {
s.setVisible(true)
}
}
object Main {
def main(args: Array[String]) {
val gui = new Starter
gui.main(args)
}
}
Run Code Online (Sandbox Code Playgroud)
抛出异常后,必须退出并再次启动sbt(重新加载不起作用).从Scala 2.8.1控制台运行相同的应用程序时,在第二次运行后抛出以下异常:
scala> m.main(Array(""))
scala> m.main(Array(""))
java.lang.IllegalStateException: Application launch must not be called more than once
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:41)
at javafx.application.Application.launch(Application.java:115)
at com.tradex.priceviewer.Starter.main(Main.scala:19)
at .<init>(<console>:11)
at .<clinit>(<console>)
at RequestResult$.<init>(<console>:9)
at RequestResult$.<clinit>(<console>)
at RequestResult$scala_repl_result(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$17.appl...
scala>
Run Code Online (Sandbox Code Playgroud)
有没有人知道如何正确退出这个scala/javafx应用程序(所以不需要重启sbt或scala控制台)?
我能够在我的系统上重现这一点.我发现从sbt运行它会在从命令行运行时生成InterruptedException,app运行正常.
我在SBT的项目设置中添加了以下内容:
fork in run := true
Run Code Online (Sandbox Code Playgroud)
这告诉SBT在一个单独的JVM中运行应用程序(和测试)而不是SBT本身.在这之后我能够多次运行应用程序并且不会得到InterruptedException.
我想你可能遇到的是在同一个JVM中运行应用程序时SBT使用的SecurityManager.它必须无法处理JavaFX应用程序正在执行的任何操作.通过在单独的JVM中运行,您可以绕过它.