【问题标题】:Exit code for sbt projectsbt 项目的退出代码
【发布时间】:2015-02-02 14:19:08
【问题描述】:

我有一个项目,使用 sbt 构建并使用 akka actor。我用“sbt 'run $args'”命令运行它,我希望这个程序根据某些条件返回不同的退出代码。为此,我使用主要演员的 System.exit(code)。
问题,我无法解决的是 sbt 退出代码取决于程序参数:有时它会因错误而退出

java.lang.RuntimeException: Nonzero exit code returned from runner: 3        at scala.sys.package$.error(package.scala:27)
[trace] Stack trace suppressed: run last compile:runMain for the full output.
[error] (compile:runMain) Nonzero exit code returned from runner: 3
[error] Total time: 5 s, completed Dec 4, 2014 6:50:50 PM

这不是美,但没关系。
但在某些情况下,我运行 System.exit(3),但 sbt 以 0 退出代码和 [success] 消息退出。
有没有办法强制 sbt 使用与我的程序相同的代码退出?
附:我不确定,但看起来参数之间的主要区别在于,在第一种情况下,程序在一个线程中执行,而在第二种情况下,它在超过 1 个线程中执行

【问题讨论】:

    标签: scala sbt akka


    【解决方案1】:

    System.exit(或更好的:sys.exit)退出当前运行时。如果 sbt forks 运行时,那么调用 sys.exit 不会退出 sbt 本身,而只会退出分叉的进程。例如,如果你有 fork in Run := true,那么调用 sbt run 将使 sbt 产生第二个独立的 JVM(目的是你显然不想在同一个 JVM 中乱来)。

    在这种情况下,您可以 define a custom run task 对实际的 sbt 实例重复 sys.exit


    编辑:这是一个最小的例子:

    // project/build.properties
    sbt.version = 0.13.6
    
    // build.sbt
    scalaVersion := "2.11.4"
    
    lazy val myRun = taskKey[Unit]("A custom run task.")
    
    fork in myRun := true
    
    myRun := {
      val r   = (runner in Compile).value
      val cp  = (fullClasspath in Compile).value
      val res = r.run("foo.Bar", cp.map(_.data), Nil, streams.value.log)
      val ExitCode = "Nonzero exit code: (-?\\d+)".r
      val code = res match {
        case Some(ExitCode(c)) => c.toInt
        case _ => 0
      }
      println(s"myRun returned with $code")
      if (code != 0) sys.exit(code)
    }
    
    // src/main/scala/foo/Bar.scala 
    package foo
    
    object Bar extends App {
      println("Hello.")
      sys.exit(3)
    }
    

    测试:sbt myRun。不要问我为什么run 返回一个Option[String] 而不是直接的Int

    【讨论】:

    • 感谢您的回答,但我收到此解决方案的错误:错误:$b001ceba8a6ab7cd4585.$sbtdef scala.reflect.internal.FatalError 中不存在符号值 ExitCode:
    • sbt 使用自己的 Scala 版本,独立于您的项目,所以这没关系。可能您没有使用 sbt 0.13。您是否看到在project/build.properties 中指定 sbt 版本的前几行?我认为旧的 sbt 版本使用 Scala 2.9,它没有我用于 ExitCode 的正则表达式方法。
    猜你喜欢
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2018-12-03
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多