InterruptedException возникает при запуске бета-приложения JavaFx 2.0 из sbt 0.10.1

При попытке запустить простое бета-приложение JavaFX 2.0, написанное на Scala 2.8.1 из sbt 0.10.1, возникает исключение после закрытия окна приложения:

> 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)

При запуске приложения из командной строки исключение не выдается и возвращается статус 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)
  }
}

После создания исключения необходимо выйти и снова запустить 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>

Кто-нибудь знает, как правильно выйти из этого приложения scala/javafx (чтобы не нужно было перезапускать консоль sbt или scala)?


person Stas    schedule 05.08.2011    source источник


Ответы (1)


Я смог воспроизвести это в своей системе. Я обнаружил, что при запуске из sbt генерируется InterruptedException, а при запуске из командной строки приложение работает нормально.

Я добавил следующее в настройки проекта в SBT:

fork in run := true

Это говорит SBT запускать приложение (и тесты) на отдельной JVM, а не на самой SBT. После этого я могу запускать приложение несколько раз и не получать InterruptedException.

Я думаю, что здесь вы можете столкнуться с SecurityManager, который SBT использует при запуске приложений в той же JVM. Он не должен иметь возможность обрабатывать все, что делает приложение JavaFX. Запустив отдельную JVM, вы обходите это.

person David Eagen    schedule 22.08.2011