2014-01-30 31 views
10

我創建了一個簡單的Scala控制檯應用程序。我通過sbt run運行它,總是收到退出以下異常:sbt.TrapExitSecurityException拋出「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 

之後,我所有的控制檯輸出變得不可見。我可以鍵入並運行應用程序,但是看不到我正在輸入的內容。

這個異常是什麼意思?我究竟做錯了什麼?

+0

你使用什麼版本的sbt?什麼是終端? –

回答

5

目前還不清楚你用的什麼版本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來調用。

你爲什麼要用它?

+0

我的sbt版本是13.0。當我執行'sys.exit(0)'時發生錯誤。什麼是終止程序的正確方法? –

+1

只需讓它在沒有'sys.exit(0)'的情況下完成。如果應用程序沒有非deamon線程並且主線程終止,那麼應用程序也是如此。 –

+0

sys.exit會殺死運行的jvm。 Sbt實施一個安全經理來避免這種情況。 http://www.scala-sbt.org/0.13/docs/Running-Project-Code.html#System.exit –

9

在SBT會話中運行控制檯應用程序時,您可以分叉您的JVM。這樣,當你的控制檯應用程序退出時,它不會殺死託管sbt JVM。我在集成測試配置中爲main類執行此操作。

build.sbt(或您的等效SBT項目配置文件):

fork in (IntegrationTest, run) := true 

(你可能想簡單地fork in run := true覆蓋控制檯主)。然後在擴展App任何類:(你可能不需要sys.exit呼籲所有,如果您的應用程序不守分叉JVM活着)

package com.example 

object StuffMain extends App { 
    println("stuff") 

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

在我來說,我就可以執行通過運行這個集成測試StuffMain

sbt> it:runMain com.example.StuffMain 
5
// build.sbt 
trapExit := false 

工作對我來說

+1

這也有一個好處,即「運行」用正確的狀態碼退出! – Douglas

+0

由於我正在構建需要返回退出代碼的程序,因此這是最佳選擇。而且由於OP正在構建一個控制檯/外殼應用程序,這也可能是最好的解決方案。 – ChuckCottrill

相關問題