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
работал у меня