无法在Windows上将流写入SBT进程

时间:2014-12-09 15:45:27

标签: windows eclipse-plugin sbt inputstream outputstream

我现在正在开发一个SBT eclipse插件,它提供了一个图形界面来在Eclipse上运行SBT任务,比如Ant视图。

一般来说,我这样做是通过启动一个新的SBT进程,并将其OutputStream重定向到Eclipse控制台视图,并写入其InputStream来运行任务。

ProcessBuilder processBuilder = new ProcessBuilder("java",
        "-Xms1024m", "-Xmx1024m",
        "-XX:ReservedCodeCacheSize=128m",
        "-Dsbt.log.noformat=true", "-XX:MaxPermSize=256m",
        "-jar", getSbtLaunchPath()).directory(new File(path));
processBuilder.environment().put("JAVA_HOME", getJavaHome());
Process sbtProcess = processBuilder.start();
final InputStream inStream = sbtProcess.getInputStream();
(new thread to write the inputStream to eclipse console view)

OutputStream outStream = sbtProcess.getOutputStream();  
PrintWriter pWriter = new PrintWriter(outStream);   //the writer to write command to SBT process

这样,如果我想运行compile任务,我就是这样做的:

pWriter.println("compile")

所有功能在Mac上运行良好。但是当我在Windows上测试它时,PrintWriter无法按照假设写入SBT进程。

对于这个问题,我确信:

  • SBT流程运行。
  • PrintWriter可以在相同的情况下写入一个小的Java echo程序进程,这意味着SBT进程可能与某些部分的普通Java进程不同。

我怀疑的是:

  • Windows上存在编码 - 不匹配问题,导致SBT进程无法识别行终止符,因此SBT不知道它是命令输入。
  • SBT贡献者在Windows系统中做了一些神奇的技巧,使得在Mac上运行良好的相同功能在Windows上无效。

所以,我觉得是时候问你们了。你觉得这个问题怎么样?我想念一下吗?

1 个答案:

答案 0 :(得分:0)

问题在于SBT使用的jline库。

我通过将-Djline.terminal=jline.UnsupportedTerminal传递给java选项解决了这个问题。