Redirect the logs from a Java Task invoked from ant?

Viewed 709

I am currently invoking a java task from ant. I am also invoking the ant target itself from java. So the workflow is java -> use ant library -> run ant target -> call java task.

This is working perfectly except that the logs printed from inside the java task are appearing in the console and are not part of the DefaultLogger class in ant.

Here is the code I am using: 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>

This is the Java class I wrote:

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());
      }
    }
  }

}

Here is the console output:
run:
message: inside run target
Hello World
done!

Typically I need the console output to appear like this:

run:
message: inside run target
mesage: Hello World
done!

1 Answers
Related