3

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

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

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

我想要的只是:

...
run:
x
...

没有前缀[java]


首屏下方:

我知道有开关-emacs(愚蠢的名字,顺便说一句)。但是,这也会删除所有其他[...]前缀 - 在类似cleanor的任务中compile。我想保留这些,并且我希望在 Ant 脚本中进行更改,而不是在 Ant 开关中。

相关的 Ant 代码为:

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

1 回答 1

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 fork="false">. 因此,您可以避免此代码的前缀,同时保留它用于任何其他任务。

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

另一种可行的技术是使用 System.console() 而不是 System.out() 进行输出。但是,这仅在您的 ANT 脚本以交互方式执行时才有效,而不是在被例如 Hudson 构建调用的情况下,并且这同样不适用于分叉的 JVM。

于 2013-04-24T02:30:25.397 回答