【问题标题】:Ant prefixing my stdout with [java]Ant 用 [java] 为我的标准输出添加前缀
【发布时间】:2012-10-31 14:40:14
【问题描述】:

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

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

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

我想要的只是:

...
run:
x
...

没有前缀[java]


首屏以下:

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

相关的Ant代码是:

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

【问题讨论】:

    标签: java ant stdout


    【解决方案1】:

    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 代码 &lt;java fork="false"&gt;。因此,您可以避免为该代码添加前缀,同时保留它用于任何其他任务。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多