在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。
答案 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() {}
}