Sbt.TrapExitSecurityException, брошенное на "sbt run"

Я создал простое консольное приложение Scala. Я запустил его sbt run и всегда получаю следующее исключение при выходе:

Exception: sbt.TrapExitSecurityException thrown from the UncaughtExceptionHandler in thread "run-main-0"
[success] Total time: 17 s, completed 30.01.2014 22:19:37

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

Что означает это исключение? Что я делаю неправильно?

Ответ 1

Вы можете разветвлять вашу JVM при запуске консольного приложения в сеансе SBT. Таким образом, когда ваше консольное приложение выйдет, он не убьет хостинг sbt JVM. Я делаю это для классов main в моей тестовой конфигурации интеграции.

В build.sbt (или ваш эквивалентный файл конфигурации проекта sbt):

fork in (IntegrationTest, run) := true

(вам может понадобиться просто fork in run := true для покрытия основной консоли). Тогда в любом классе, который расширяет App:

package com.example

object StuffMain extends App {
  println("stuff")

  sys.exit(0) // 0 is a successful Unix exit code
}

(Вам может не понадобиться вызов sys.exit вообще, если ваше приложение не поддерживает разветвленную JVM.)

В моем случае я смогу выполнить этот интеграционный тест StuffMain, выполнив:

sbt> it:runMain com.example.StuffMain

Ответ 2

Непонятно, какую версию SBT вы используете, но с SBT 0.13.2-M1 она была легко воспроизведена со следующим классом:

Hello.scala

object ExitApp extends App {
  exit(0)
}

Класс точно показывает, когда генерируется исключение sbt.TrapExitSecurityException - всякий раз, когда вызывается метод java.lang.Runtime.exit(int).

$ sbt run
[info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins
[info] Loading project definition from /Users/jacek/sandbox/so/TrapExitSecurityException/project
[info] Set current project to trapexitsecurityexception (in build file:/Users/jacek/sandbox/so/TrapExitSecurityException/)
[warn] there were 1 deprecation warning(s); re-run with -deprecation for details
[warn] one warning found
[info] Running ExitApp

Exception: sbt.TrapExitSecurityException thrown from the UncaughtExceptionHandler in thread "run-main-0"
[success] Total time: 6 s, completed Jan 30, 2014 9:05:24 PM

Удалите вызов из приложения и исключение исчезнет. Согласно sbt.TrapExit scaladoc:

Эту категорию кода следует вызывать только с помощью нового JVM.

Почему вы используете его вообще?

Ответ 3

// build.sbt
trapExit := false

работал у меня