diff --git a/WHATSNEW b/WHATSNEW
index 4f2b9f7e4..a8c62f44c 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -40,6 +40,11 @@ Fixed bugs:
explicitly disable caching to avoid problems with reloading jars.
Bugzilla Report 54473
+ * AntClassloader will now ignore files that are part of the classpath but
+ not valid zip files when scanning for resources. It used to throw
+ an exception.
+ Bugzilla Report 53964
+
Other changes:
--------------
diff --git a/src/main/org/apache/tools/ant/AntClassLoader.java b/src/main/org/apache/tools/ant/AntClassLoader.java
index 7be318b25..58351f9f2 100644
--- a/src/main/org/apache/tools/ant/AntClassLoader.java
+++ b/src/main/org/apache/tools/ant/AntClassLoader.java
@@ -41,6 +41,7 @@ import java.util.jar.Attributes.Name;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
+import java.util.zip.ZipException;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.util.CollectionUtils;
import org.apache.tools.ant.util.FileUtils;
@@ -1003,7 +1004,19 @@ public class AntClassLoader extends ClassLoader implements SubBuildListener {
} else {
if (jarFile == null) {
if (file.exists()) {
- jarFile = new JarFile(file);
+ try {
+ jarFile = new JarFile(file);
+ } catch (ZipException notAJar) {
+ // raised if a file that is not a ZIP
+ // happens to be part of the classpath -
+ // this obviously cannot contain the
+ // resource
+ String msg = "CLASSPATH element " + file
+ + " is not a JAR.";
+ log(msg, Project.MSG_WARN);
+ System.err.println(msg);
+ return null;
+ }
jarFiles.put(file, jarFile);
} else {
return null;
diff --git a/src/tests/antunit/taskdefs/optional/junit/junit-test.xml b/src/tests/antunit/taskdefs/optional/junit/junit-test.xml
index c3efbeca5..873ce0e0b 100644
--- a/src/tests/antunit/taskdefs/optional/junit/junit-test.xml
+++ b/src/tests/antunit/taskdefs/optional/junit/junit-test.xml
@@ -345,4 +345,24 @@ public class BTest extends TestCase {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/tests/junit/org/apache/tools/ant/AntClassLoaderTest.java b/src/tests/junit/org/apache/tools/ant/AntClassLoaderTest.java
index 32503ac21..963fa7b19 100644
--- a/src/tests/junit/org/apache/tools/ant/AntClassLoaderTest.java
+++ b/src/tests/junit/org/apache/tools/ant/AntClassLoaderTest.java
@@ -168,13 +168,13 @@ public class AntClassLoaderTest extends BuildFileTest {
System.setErr(err);
loader.getResource("foo.txt");
String log = getLog();
- int startMessage = log.indexOf("Unable to obtain resource from ");
+ int startMessage = log.indexOf("CLASSPATH element ");
assertTrue(startMessage >= 0);
- assertTrue(log.indexOf("foo.jar", startMessage) > 0);
+ assertTrue(log.indexOf("foo.jar is not a JAR", startMessage) > 0);
log = errBuffer.toString();
- startMessage = log.indexOf("Unable to obtain resource from ");
+ startMessage = log.indexOf("CLASSPATH element ");
assertTrue(startMessage >= 0);
- assertTrue(log.indexOf("foo.jar", startMessage) > 0);
+ assertTrue(log.indexOf("foo.jar is not a JAR", startMessage) > 0);
} finally {
System.setErr(sysErr);
}