用[java]为我的标准输出添加前缀

时间:2012-10-31 14:40:15

标签: java ant stdout

我有一个简单的Java应用程序,它由Ant脚本构建和执行。

当我在代码中说System.out.println("x")时,会有以下输出:

...
run:
    [java] x
...

我想要的只是:

...
run:
x
...

没有前缀[java]


首屏下方:

我知道有一个开关-emacs(愚蠢的名字,BTW)。但是,这也会删除所有其他[...]前缀 - 在cleancompile等任务中。我想保留这些,我希望更改是在Ant脚本中,而不是Ant开关。

相关的Ant代码是:

    <target name="run" depends="jar">
        <java fork="true" jar="MyCoolProgram.jar"/>
    </target>

1 个答案:

答案 0 :(得分:3)

ANT使用java.lang.System.setOut / setErr将标准输出/标准错误重定向到自己的输出代码。但是,您可以使用java.io.FileDescriptor.out / err字段返回原始标准输出/错误。您需要使用FileOutputStream打开这些字段,然后依次打开java.io.PrintStream:

import java.io.*;
...
PrintStream out = new PrintStream(new FileOutputStream(FileDescriptor.out));
PrintStream err = new PrintStream(new FileOutputStream(FileDescriptor.err));

这将适用于任何自定义ANT任务,以及您启动的任何Java代码 <java fork="false">。因此,您可以避免使用此代码的前缀,同时将其保留用于任何其他任务。

但是,当您使用<java fork="true">启动时,传递给您的子流程的标准输出和标准错误将由ANT控制,并且上述技术将不起作用。如果您真的必须在单独的JVM中运行代码,那么编写自己的ANT任务来启动此代码可能是一种选择。

另一种有效的技术是使用System.console()来代替System.out()。但是,这仅在交互式执行ANT脚本时才有效,而不是由例如一个Hudson构建,再次这对分叉的JVM不起作用。