3

Ant スクリプトによってビルドおよび実行される単純な Java アプリケーションがあります。

コードで言うSystem.out.println("x")と、次の出力があります。

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

私が欲しいのは単純です:

...
run:
x
...

プレフィックスなし[java]


フォールドの下:

スイッチがあることは知っています-emacs(ばかげた名前、ところで)。ただし、これにより、または[...]のようなタスクで、他のすべてのプレフィックスも削除されます。私はそれらを保持したいのですが、Ant スイッチではなく、Ant スクリプトに変更を加えたいと考えています。cleancompile

関連する 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 コードで機能します <java fork="false">。したがって、このコードのプレフィックスを回避しながら、他のタスクのためにそれを保持できます。

ただし、 で起動すると<java fork="true">、サブプロセスに渡される標準出力と標準エラーは ANT によって制御され、上記の手法は機能しません。別の JVM でコードを実行する必要がある場合は、このコードを起動する独自の ANT タスクを作成することもできます。

System.out() の代わりに System.console() を出力に使用する方法も効果的です。ただし、これは ANT スクリプトが対話的に実行されている場合にのみ機能し、Hudson ビルドなどによって呼び出されている場合には機能しません。また、フォークされた JVM では機能しません。

于 2013-04-24T02:30:25.397 に答える