从 ant 调用的 Java 任务重定向日志?

Redirect the logs from a Java Task invoked from ant?

我目前正在从 ant 调用 java 任务。我还从 java 调用了 ant 目标本身。所以工作流程是 java -> 使用 ant 库 -> 运行 ant 目标 -> 调用 java 任务。

除了从 java 任务内部打印的日志出现在控制台中并且不是 ant 中的 DefaultLogger class 的一部分之外,这工作得很好。

这是我使用的代码: build.xml

<project>
    <target name="run">
    <echo message="inside run target"/>
     <java classname="oata.HelloWorld"    failonerror="true"> 
         <classpath>
           <pathelement location="hello.jar"/>
         </classpath>
     </java>   

    </target>
</project>

这是Javaclass我写的:

package com.test;


import java.io.File;

import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.DefaultLogger;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectHelper;


public class Test
{

  public static void main(String[] args)
  { 
    new Test().run(); 
  }

  public void run()
  {
    File buildFile = new File("C:\TEMP\build.xml");
    Project p = new Project();

    MyLogger consoleLogger = new MyLogger();
    consoleLogger.setErrorPrintStream(System.err);
    consoleLogger.setOutputPrintStream(System.out);
    consoleLogger.setMessageOutputLevel(Project.MSG_INFO);

    p.addBuildListener(consoleLogger);

    p.setUserProperty("ant.file", buildFile.getAbsolutePath());
    p.init();
    ProjectHelper helper = ProjectHelper.getProjectHelper();
    p.addReference("ant.projectHelper", helper);
    helper.parse(p, buildFile);
    p.executeTarget("run");
    System.out.println("done!");
  }

  class MyLogger extends DefaultLogger
  { 
    @Override
    public void messageLogged(BuildEvent event)
    {
      int priority = event.getPriority(); 

      // Filter out messages based on priority
      if (priority <= msgOutputLevel)
      {
        System.out.println("message: " + event.getMessage());
      }
    }
  }

}

控制台输出如下:
运行:
消息:内部 运行 目标
你好世界
完成!

通常我需要控制台输出如下所示:

运行:
消息:内部 运行 目标
消息:你好世界
完成!

经过一整天的挖掘,我自己找到了解决方案。我刚刚在 build.xml 文件中更改为使用 exec 而不是 java,如下所示:

 <target name="run2" description="runs my class">
     <echo message="inside run 2 target"/>
     <exec executable="java">
       <arg line="-classpath hello.jar com.HelloWorld"/>
     </exec>
 </target>