From 9923ec1698e2db35926a074a84a056002c51764e Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Tue, 1 Sep 2009 14:10:12 +0000 Subject: [PATCH] ensure classloaders get cleaned up when no longer needed git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@810063 13f79535-47bb-0310-9956-ffa450edef68 --- .../resources/AbstractClasspathResource.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/org/apache/tools/ant/types/resources/AbstractClasspathResource.java b/src/main/org/apache/tools/ant/types/resources/AbstractClasspathResource.java index def8e1dc0..6b2548b5e 100644 --- a/src/main/org/apache/tools/ant/types/resources/AbstractClasspathResource.java +++ b/src/main/org/apache/tools/ant/types/resources/AbstractClasspathResource.java @@ -24,6 +24,7 @@ import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.Reference; import org.apache.tools.ant.util.FileUtils; +import java.io.FilterInputStream; import java.io.InputStream; import java.io.IOException; import java.util.Stack; @@ -172,6 +173,7 @@ public abstract class AbstractClasspathResource extends Resource { } dieOnCircularReference(); ClassLoader cl = null; + boolean clNeedsCleanup = false; if (loader != null) { cl = (ClassLoader) loader.getReferencedObject(); } @@ -186,6 +188,7 @@ public abstract class AbstractClasspathResource extends Resource { getProject(), p, false); } + clNeedsCleanup = loader != null; } else { cl = JavaResource.class.getClassLoader(); } @@ -194,7 +197,22 @@ public abstract class AbstractClasspathResource extends Resource { } } - return openInputStream(cl); + final ClassLoader classLoader = cl; + return !clNeedsCleanup + ? openInputStream(cl) + : new FilterInputStream(openInputStream(cl)) { + public void close() throws IOException { + FileUtils.close(in); + ((AntClassLoader) classLoader).cleanup(); + } + protected void finalize() throws Throwable { + try { + close(); + } finally { + super.finalize(); + } + } + }; } /**