完成分叉进程会使用自定义输出策略阻止SBT

时间:2016-03-04 08:28:25

标签: sbt

在SBT中,我用以下方法分叉Java进程:

class FilteredOutput extends FilterOutputStream(System.out) {
    var buf = ArrayBuffer[Byte]()
    override def write(b: Int) {
        buf.append(b.toByte)
        if (b == '\n'.toInt)
            flush()
    }

    override def flush(){
        if (buf.nonEmpty) {
            val arr = buf.toArray
            val txt = try new String(arr, "UTF-8") catch { case NonFatal(ex) ⇒ "" }
            if (!txt.startsWith("pydev debugger: Unable to find real location for"))
                out.write(arr)
            buf.clear()
        }
        super.flush()
    }
}

var process = Option.empty[Process]
process = Some(Fork.java.fork(ForkOptions(outputStrategy = new FilteredOutput()), Seq("my.company.MyClass")))

作为自定义任务的结果。

稍后,我将其终止:

process.map { p =>
    log info "Killing process"
    p.destroy()
}

通过另一个自定义任务。 结果是SBT不接受更多输入并被阻止。 Ctrl + C是恢复控制权的唯一方法,但SBT因此而死亡。

问题与自定义输出策略有关,它可以过滤一些恼人的消息。

jstack {我没有看到任何僵局。

SBT版本0.13.9。

1 个答案:

答案 0 :(得分:0)

解决方案是避免关闭System.out:

class FilteredOutput extends FilterOutputStream(System.out) {
    var buf = ArrayBuffer[Byte]()
    override def write(b: Int) {
       ...
    }

    override def flush(){
       ...
    }

    override def close() {}
}