如何实时逐行打印 Gradle BuildLauncher 的输出流
How to Print Output Stream of Gradle BuildLauncher Live and Line-by-line
我正在使用 Gradle 工具 API 以编程方式执行构建任务。为此,我在其上使用了 BuildLauncher 和 运行.forTasks("clean")。我想逐行实时打印标准输出和标准错误。
我已经能够打印整个标准输出,但只能在使用以下代码完成构建过程后才能打印。
// connector already created and set up
ProjectConnection connection = connector.connect();
BuildLauncher build = connection.newBuild();
build.forTasks("clean");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
build.setStandardOutput(outputStream);
build.setStandardError(outputStream);
build.run();
System.out.println(outputStream.toString());
connection.close();
我想出了一个解决方案并正在回答我自己的问题以防有人偶然发现它。
关键是在创建新的 OutputStream 对象时覆盖 write() 方法。下面的代码打印所有实时内容,line-by-line 到 System.out,但可以轻松更改为打印到 GUI、工具 window(我正在做的)或其他任何地方。
// connector already created and set up
ProjectConnection connection = connector.connect();
BuildLauncher build = connection.newBuild();
build.forTasks("clean");
OutputStream outputStream = new OutputStream() {
@Override
public void write(int b) throws IOException {
System.out.print((char) b); // or output it to anywhere else you'd like
}
};
build.setStandardOutput(outputStream);
build.setStandardError(outputStream);
build.run();
connection.close();
你可以这样做:
build.setStandardOutput(System.out);
build.setStandardError(System.err);
我正在使用 Gradle 工具 API 以编程方式执行构建任务。为此,我在其上使用了 BuildLauncher 和 运行.forTasks("clean")。我想逐行实时打印标准输出和标准错误。
我已经能够打印整个标准输出,但只能在使用以下代码完成构建过程后才能打印。
// connector already created and set up
ProjectConnection connection = connector.connect();
BuildLauncher build = connection.newBuild();
build.forTasks("clean");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
build.setStandardOutput(outputStream);
build.setStandardError(outputStream);
build.run();
System.out.println(outputStream.toString());
connection.close();
我想出了一个解决方案并正在回答我自己的问题以防有人偶然发现它。
关键是在创建新的 OutputStream 对象时覆盖 write() 方法。下面的代码打印所有实时内容,line-by-line 到 System.out,但可以轻松更改为打印到 GUI、工具 window(我正在做的)或其他任何地方。
// connector already created and set up
ProjectConnection connection = connector.connect();
BuildLauncher build = connection.newBuild();
build.forTasks("clean");
OutputStream outputStream = new OutputStream() {
@Override
public void write(int b) throws IOException {
System.out.print((char) b); // or output it to anywhere else you'd like
}
};
build.setStandardOutput(outputStream);
build.setStandardError(outputStream);
build.run();
connection.close();
你可以这样做:
build.setStandardOutput(System.out);
build.setStandardError(System.err);