diff --git a/src/main/org/apache/tools/ant/taskdefs/LogStreamHandler.java b/src/main/org/apache/tools/ant/taskdefs/LogStreamHandler.java index f5a739a17..783c7935d 100644 --- a/src/main/org/apache/tools/ant/taskdefs/LogStreamHandler.java +++ b/src/main/org/apache/tools/ant/taskdefs/LogStreamHandler.java @@ -54,11 +54,13 @@ package org.apache.tools.ant.taskdefs; +import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; import java.io.OutputStream; import java.io.InputStream; +import java.io.IOException; /** * Logs standard output and error of a subprocess to the log system of ant. @@ -79,4 +81,14 @@ public class LogStreamHandler extends PumpStreamHandler { new LogOutputStream(task, errlevel)); } + public void stop() { + super.stop(); + try { + getErr().close(); + getOut().close(); + } catch (IOException e) { + // plain impossible + throw new BuildException(e); + } + } } diff --git a/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java b/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java index f4e9ba2b1..5de274e62 100644 --- a/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java +++ b/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java @@ -113,6 +113,20 @@ public class PumpStreamHandler implements ExecuteStreamHandler { try { errorThread.join(); } catch(InterruptedException e) {} + try { + err.flush(); + } catch (IOException e) {} + try { + out.flush(); + } catch (IOException e) {} + } + + protected OutputStream getErr() { + return err; + } + + protected OutputStream getOut() { + return out; } protected void createProcessOutputPump(InputStream is, OutputStream os) { diff --git a/src/main/org/apache/tools/ant/taskdefs/compilers/Javac12.java b/src/main/org/apache/tools/ant/taskdefs/compilers/Javac12.java index aca48f786..606683932 100644 --- a/src/main/org/apache/tools/ant/taskdefs/compilers/Javac12.java +++ b/src/main/org/apache/tools/ant/taskdefs/compilers/Javac12.java @@ -79,10 +79,10 @@ public class Javac12 extends DefaultCompilerAdapter { attributes.log("Using classic compiler", Project.MSG_VERBOSE); Commandline cmd = setupJavacCommand(); + OutputStream logstr = new LogOutputStream(attributes, Project.MSG_WARN); try { // Create an instance of the compiler, redirecting output to // the project log - OutputStream logstr = new LogOutputStream(attributes, Project.MSG_WARN); Class c = Class.forName("sun.tools.javac.Main"); Constructor cons = c.getConstructor(new Class[] { OutputStream.class, String.class }); Object compiler = cons.newInstance(new Object[] { logstr, "javac" }); @@ -103,6 +103,13 @@ public class Javac12 extends DefaultCompilerAdapter { } else { throw new BuildException("Error starting classic compiler: ", ex, location); } + } finally { + try { + logstr.close(); + } catch (IOException e) { + // plain impossible + throw new BuildException(e); + } } } } diff --git a/src/main/org/apache/tools/ant/taskdefs/compilers/Javac13.java b/src/main/org/apache/tools/ant/taskdefs/compilers/Javac13.java index a50713f95..d0724511e 100644 --- a/src/main/org/apache/tools/ant/taskdefs/compilers/Javac13.java +++ b/src/main/org/apache/tools/ant/taskdefs/compilers/Javac13.java @@ -86,10 +86,10 @@ public class Javac13 extends DefaultCompilerAdapter { PrintStream err = System.err; PrintStream out = System.out; + PrintStream logstr = + new PrintStream(new LogOutputStream(attributes, Project.MSG_WARN)); // Use reflection to be able to build on all JDKs >= 1.1: try { - PrintStream logstr = - new PrintStream(new LogOutputStream(attributes, Project.MSG_WARN)); System.setOut(logstr); System.setErr(logstr); Class c = Class.forName ("com.sun.tools.javac.Main"); @@ -108,6 +108,7 @@ public class Javac13 extends DefaultCompilerAdapter { } finally { System.setErr(err); System.setOut(out); + logstr.close(); } } } diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/Javah.java b/src/main/org/apache/tools/ant/taskdefs/optional/Javah.java index ac84408ee..f8834ec41 100755 --- a/src/main/org/apache/tools/ant/taskdefs/optional/Javah.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/Javah.java @@ -311,14 +311,14 @@ public class Javah extends Task { PrintStream err = System.err; PrintStream out = System.out; + PrintStream logstr = + new PrintStream(new LogOutputStream(this, Project.MSG_WARN)); try { // Javac uses logstr to change the output stream and calls // the constructor's invoke method to create a compiler instance // dynamically. However, javah has a different interface and this // makes it harder, so here's a simple alternative. //------------------------------------------------------------------ - PrintStream logstr = - new PrintStream(new LogOutputStream(this, Project.MSG_WARN)); System.setOut(logstr); System.setErr(logstr); com.sun.tools.javah.Main main = new com.sun.tools.javah.Main( cmd.getArguments() ); @@ -338,6 +338,7 @@ public class Javah extends Task { } finally { System.setErr(err); System.setOut(out); + logstr.close(); } }