我有一个简单的Java应用程序,它由Ant脚本构建和执行。
当我在代码中说System.out.println("x")
时,会有以下输出:
...
run:
[java] x
...
我想要的只是:
...
run:
x
...
没有前缀[java]
。
首屏下方:
我知道有一个开关-emacs
(愚蠢的名字,BTW)。但是,这也会删除所有其他[...]
前缀 - 在clean
或compile
等任务中。我想保留这些,我希望更改是在Ant脚本中,而不是Ant开关。
相关的Ant代码是:
<target name="run" depends="jar">
<java fork="true" jar="MyCoolProgram.jar"/>
</target>
答案 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不起作用。